我试图以随机的方式对整数的ArrayList进行洗牌。我想出了下面的代码。但是,我怀疑这是正确的做法。我已经阅读了for(int i = list.size(); i >= 1; i--)
中的某个地方:
public static void shuffling(List<?> list, Random rnd){
for(int i = list.size(); i >= 1; i--){
swap(list, i - 1, rnd.nextInt(i));
}
}
应该改为:
for(int i = list.size(); i > 1; i--)
但如果我选择将其写为i > 1
而不是i >= 1
,那么我是不是忽略了ArrayList中的第一项?任何人对于解决这个问题的正确方法有什么建议吗?
我的代码:
public class TheCollectionInterface {
public static <E> void swap(List<E> a, int i, int j){
E temp = a.get(i);
a.set(i, a.get(j));
a.set(j, temp);
}
public static void shuffling(List<?> list, Random rnd){
for(int i = list.size(); i >= 1; i--){
swap(list, i - 1, rnd.nextInt(i));
}
}
public static void main(String[] args) {
List<Integer> li1 = new ArrayList<>(Arrays.asList(1,2,3,4,5,6,7,8,9));
Random r1 = new Random();
TheCollectionInterface.shuffling(li1, r1);
System.out.println(li1);
}
}
答案 0 :(得分:2)
当在这个循环中i = 1
时,唯一要选择的元素是第0个元素,并且使用第0个元素交换第0个元素是微不足道的,并且不起作用。因此,您不需要使用i = 1
进入循环,您可以将i > 1
作为条件。
答案 1 :(得分:-1)
Collections.shuffle
,如果您不想自己动手。