public static void selectionShuffle(int[] values) {
Random rand = new Random();
for(int i = values.length; i > 0; i--) {
int r = rand.nextInt(i);
swap(values, r, i);
}
//updated answer to include below method
public static void swap(int[]a, int i, int j){
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
我正在写纸牌游戏,需要对纸牌进行随机排序,当我运行上述代码时,我得到了ArrayOutOfBoundsException,编译器特别抱怨 values[i] = values[r]
的重新分配。明确地说,这是不是旨在用作选择排序,而是用于选择 shuffle 。任何帮助表示赞赏!
答案 0 :(得分:0)
您的开始条件必须为values.length-1
,因为Java数组是0
至length-1
。
测试也应该是>=0
,因为在您编写时,它只会下降到索引1
。
for(int i = values.length - 1; i >= 0; i--) {
或者如IłyaBursov所指出的,您可以在索引i-1
进行比较,并在有条件时保留for循环条件。不确定像上面的示例一样,我总是这样做是最好的形式。
而且,您没有在改组。您将索引i
的值设置为r
的值,但是丢失了先前i
的值。您需要一个临时变量来交换值。
tmp = values[i];
values[i] = values[r];
values[r] = tmp;
答案 1 :(得分:0)
或者,您可以尝试Collections.shuffle(),但是如果您必须首先使用包装器类Integer
而不是原始类型int
,它将更加方便。
整数[]版本:
public static void selectionShuffle(Integer[] values) {
Collections.shuffle(Arrays.asList(values));
}
int []版本:
public static void selectionShuffle(int[] values) {
Integer[] boxedArr = Arrays.stream(values).boxed().toArray( Integer[]::new );
Collections.shuffle(Arrays.asList(boxedArr));
for(int i=0 ; i<values.length ; i++){
values[i] = boxedArr[i];
}
}