给定一个String数组,如何创建第二个数组,这是原始的重新排列?

时间:2012-10-12 23:10:30

标签: java shuffle

我正在尝试创建一个方法来获取一个名称数组,并返回一个列表的副本,其名称随机重新排列。下面的代码返回一个包含重复名称的新列表。我可以做些什么来改变新列表的名称呢?

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;
}

4 个答案:

答案 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)

Collections.shuffle(列表)

Info

您可以使用ToList将其设为shuffle的列表,然后使用ToArray返回数组。

这可能不是最有效的,但它是最简单的。

答案 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]);
}