我正在尝试创建一个方法来获取一个名称数组,并返回一个列表的副本,其名称随机重新排列。下面的代码返回一个包含重复名称的新列表。我可以做些什么来改变新列表的名称呢?
public static String[] shuffle(String []names)
{
int num =0;
String [] newArray = new String [names.length];
Random r = new Random ();
for(int i = 0; i<names.length; i++){
num = r.nextInt(names.length);
if((i-1)!=num){
newArray[i]=names[num];
}
}
return newArray;
}
答案 0 :(得分:3)
您可以使用Collections.shuffle()
随机播放列表。
如果您渴望自己做 - 请查看fisher-yates shuffle。
(伪代码:)
for (i = n-1; i >= 0; i--)
swap(names,i,r.nextInt(i+1));
(其中swap()
是交换数组中两个元素的标准交换函数)
(注意,如果你想要一个带有混洗数组的新实例 - 只需在运行算法之前使用Arrays.copyOf()
复制它。
答案 1 :(得分:1)
答案 2 :(得分:1)
像其他人一样建议已经有其他切割器/简单的方法来做到这一点,但要解决代码中的问题,你需要使newArray成为names数组的副本(你可以使用Arrays.copyOf)然后正确交换值,如:
if(i!=num){
String aux=newArray[i];
newArray[i]=newArray[num];
newArray[num]=aux;
}
答案 3 :(得分:0)
public String[] shuffle(String[] ss) {
List<String> list = Collections.shuffle(Arrays.asList(ss));
return list.toArray(new String[ss.length]);
}