我已经创建了简单的随机播放方法,但似乎还有一个我无法找到的问题。
以下是我的代码:
public static <E> void shuffle(List<? extends E> list) {
List<E> temp = new ArrayList<>();
while (list.size() != 0) {
E val = list.remove((int) (Math.random() * list.size()));
temp.add(val);
System.out.println(val);
}
System.out.println(temp);
list = temp;
}
这是测试用例:
ArrayList<Integer> arr = new ArrayList<>();
arr.add(1);
arr.add(2);
arr.add(3);
arr.add(4);
arr.add(5);
arr.add(6);
System.out.println(arr);
shuffle(arr);
System.out.println("-->" + arr);
问题是上次打印输出方法显示arr为空 - &gt; []它应该是那样的[4,3,1,2,6,5]
问题可能是这一行,但我不明白为什么?
--> list = temp;
答案 0 :(得分:2)
是的,就是这一行:
list = temp;
所有这一切都是将temp
引用复制到list
引用。现在,list
和temp
都引用了temp
最初引用的本地列表。
您需要将temp
的内容添加回list
。
list.addAll(temp);
答案 1 :(得分:2)
list = temp
只是将一个新值(temp
的内容)分配给名为list
的局部变量 - 它不会更改list
最初指向的对象。
如果您想要实现此类功能,您只需将temp
中的所有项目重新添加到list
(while
循环结束后,您就知道了这一点&#39;空的):
list.addAll(temp);
答案 2 :(得分:1)
shuffle方法接收列表引用的副本。当您执行list = temp;
时,您告诉该引用指向temp
。
所以你基本上清空了传递给方法的列表,然后你就失去了对它的访问权。