Java 中的紧凑洗牌代码
Compact shuffling code in Java
我需要在 Java 中重复生成随机顺序的整数数组。我想出了以下丑陋的片段(在更大的循环中运行)。什么是更有效或更紧凑的方式来做同样的事情?
ArrayList<Integer> t = new ArrayList<>();
int[] d = new int[elts];
for (int i = 0; i < elts; i++) {
t.add(i);
}
Collections.shuffle(t);
for (int i = 0; i < elts; i++) {
d[i] = t.get(i);
}
使用 Java 8 流 API:
List<Integer> list = IntStream.range(0, elts).boxed().collect(toList());
Collections.shuffle(list);
int[] d = list.stream().mapToInt(i -> i).toArray();
将在 Java 8
中正常工作
List<Integer> range = IntStream.range(0, elts).boxed().collect(Collectors.toList());
Collections.shuffle(range);
Integer[] arr = new Integer[elts];
range.toArray(arr);
与 Java 8 Stream API 相同,但使用 collectAndThen()
IntStream.range(0, elts). // range from 0 to elts
boxed(). // from int to Integer
collect(collectingAndThen(toList(), integers -> { //collect to list
Collections.shuffle(integers); //shuffle integer
return integers.toArray(new Integer[integers.size()]); // convert list to array
}));
与 StreamEx
int[] ints = IntStreamEx.range(0, elts)
.sorted((o1, o2) -> random.nextInt())
.toArray();
我需要在 Java 中重复生成随机顺序的整数数组。我想出了以下丑陋的片段(在更大的循环中运行)。什么是更有效或更紧凑的方式来做同样的事情?
ArrayList<Integer> t = new ArrayList<>();
int[] d = new int[elts];
for (int i = 0; i < elts; i++) {
t.add(i);
}
Collections.shuffle(t);
for (int i = 0; i < elts; i++) {
d[i] = t.get(i);
}
使用 Java 8 流 API:
List<Integer> list = IntStream.range(0, elts).boxed().collect(toList());
Collections.shuffle(list);
int[] d = list.stream().mapToInt(i -> i).toArray();
将在 Java 8
中正常工作List<Integer> range = IntStream.range(0, elts).boxed().collect(Collectors.toList());
Collections.shuffle(range);
Integer[] arr = new Integer[elts];
range.toArray(arr);
与 Java 8 Stream API 相同,但使用 collectAndThen()
IntStream.range(0, elts). // range from 0 to elts
boxed(). // from int to Integer
collect(collectingAndThen(toList(), integers -> { //collect to list
Collections.shuffle(integers); //shuffle integer
return integers.toArray(new Integer[integers.size()]); // convert list to array
}));
与 StreamEx
int[] ints = IntStreamEx.range(0, elts)
.sorted((o1, o2) -> random.nextInt())
.toArray();