我需要创建一个具有从1到16的名单上随机值的二维表。我每次调用函数时就应该给我1到16个值2D名单。
我用这种方式做到了这一点
public List<List<Integer>> shuffle() {
List<List<Integer>> ls = new ArrayList<>();
ls.add(Arrays.asList(0, 0, 0, 0));
ls.add(Arrays.asList(0, 0, 0, 0));
ls.add(Arrays.asList(0, 0, 0, 0));
ls.add(Arrays.asList(0, 0, 0, 0));
Random rand = new Random();
int x = 1, a, b;
while (x < 17) {
a = rand.nextInt(4);
b = rand.nextInt(4);
if (ls.get(a).get(b) == 0) {
ls.get(a).set(b, x);
x++;
}
}
return ls;
}
此功能平均只需75圈创造16元的2D名单,是任何其他方式有效地做到这一点?
您的方法名称已暗示什么必须做。而不是猜测下一个索引集的,只是洗牌的元素。如果你已经洗牌值,您可以简单地切片他们成2维列表。
public List<List<Integer>> create4x4RandomMatrix() {
List<Integer> ints = IntStream.rangeClosed(1, 16).boxed().collect(Collectors.toList());
Collections.shuffle(ints);
List<List<Integer>> matrix = new ArrayList<>();
for (int i = 0; i < 4; i++) {
matrix.add(ints.subList(i * 4, (i + 1) * 4));
}
return matrix;
}
因为它是一个固定的4×4矩阵@Holger是正确的以静态方式来创建它:
public List<List<Integer>> create4x4RandomMatrix() {
List<Integer> ints = IntStream.rangeClosed(1, 16).boxed().collect(Collectors.toList());
Collections.shuffle(ints);
return Arrays.asList(ints.subList(0, 4), ints.subList(4, 8),
ints.subList(8, 12), ints.subList(12, 16));
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句