0

我正在尝试创建一种方法来获取名称数组并返回列表的副本,其中名称随机重新排列。下面的代码返回一个具有重复名称的新列表。我该怎么做才能改组新列表的名称?

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

4 回答 4

3

您可以使用Collections.shuffle()随机播放列表。

如果您渴望自己动手 - 看看Fisher-yates shuffle
(伪代码:)

for (i = n-1; i >= 0; i--) 
    swap(names,i,r.nextInt(i+1));

swap()交换数组中两个元素的标准交换函数在哪里)

(注意,如果您想要一个带有洗牌数组的新实例 - 只需Arrays.copyOf()在运行算法之前使用复制它。

于 2012-10-12T23:13:24.167 回答
1

Collections.shuffle(列表)

信息

您可以使用ToList使其成为随机播放列表,然后使用ToArray返回数组。

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

于 2012-10-12T23:12:39.317 回答
1

就像其他人建议的那样,已经有其他切割器/简单的方法可以做到这一点,但要解决代码中的问题,您需要将 newArray 设为名称数组的副本(您可以使用 Arrays.copyOf),然后正确交换值,例如:

if(i!=num){
   String aux=newArray[i];
   newArray[i]=newArray[num];
   newArray[num]=aux;
}
于 2012-10-12T23:30:25.723 回答
0
public String[] shuffle(String[] ss) {
  List<String> list = Collections.shuffle(Arrays.asList(ss));
  return list.toArray(new String[ss.length]);
}
于 2012-10-12T23:14:52.553 回答