Java 给定一个字符串数组,如何创建第二个数组,它是对原始数组的重新排列?

Java 给定一个字符串数组,如何创建第二个数组,它是对原始数组的重新排列?,java,shuffle,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&l

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

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;
}
publicstaticstring[]shuffle(String[]names)
{
int num=0;
String[]newArray=新字符串[names.length];
Random r=新的Random();
对于(int i=0;iCollections.shuffle(列表)

您可以使用使其成为洗牌列表,然后使用返回到数组

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

集合。无序排列(列表)

您可以使用使其成为洗牌列表,然后使用返回到数组

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

您可以使用它来洗牌列表

如果你渴望自己做这件事,那就去看看吧。
(伪代码:)

(其中
swap()
是交换数组中两个元素的标准交换函数)

(注意,如果您想要一个新的实例和无序排列的数组,只需在运行算法之前使用复制它即可。

您可以使用来无序排列列表

如果你渴望自己做这件事,那就去看看吧。
(伪代码:)

(其中
swap()
是交换数组中两个元素的标准交换函数)

(注意,如果您想要一个新的实例和无序数组,只需在运行算法之前使用复制即可。

public String[]shuffle(String[]ss){
List=Collections.shuffle(Arrays.asList(ss));
返回list.toArray(新字符串[ss.length]);
}
公共字符串[]洗牌(字符串[]ss){
List=Collections.shuffle(Arrays.asList(ss));
返回list.toArray(新字符串[ss.length]);
}

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

if(i!=num){
   String aux=newArray[i];
   newArray[i]=newArray[num];
   newArray[num]=aux;
}

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

if(i!=num){
   String aux=newArray[i];
   newArray[i]=newArray[num];
   newArray[num]=aux;
}

否。(1)该算法不会返回置换-它可能包含重复的置换。(2)此时,
aux
中没有点,
newArray[i]==null
,因此您基本上是在处理原始置换,并将
null
s放入其中(在以后的置换中可能会流向
newArray
)。此外,如果您考虑在同一数组中进行交换,则此解决方案是有偏差的,因为必须在范围
[0,i]中选择随机数
获得均匀分布的排列。谢谢@amid,你部分正确。我没有创建重复项,因为我假设我正在处理原始数组。我更新了我的答案。此外,nextInt正在生成均匀分布的值,以便获得正确的排列。每个int都将均匀分布,但排列ATION本身不会。(一些解决方案比其他解决方案更有可能,这不是期望的功能)讨论此问题。(我承认这是一个有点复杂的问题,但它是一个重要的问题)。此外-解决方案仍然不起作用-(最后一行仍然是
names
,而不是
newArray
,您需要在开始之前填充
newArray
,否则-它只是一堆移动的
null
s)@在产生这样的排列时,它不会产生均匀分布的排列,但排列仍然有效。他只需要一个排列。我的回答是,排列只是为了帮助他找出代码中的问题。无论如何,谢谢,我学到了一些新东西。不。(1)该算法不会返回置换-它可能包含重复的置换。(2)此时,
aux
中没有点,
newArray[i]==null
,因此您基本上是在操作原始置换,并将
null
s放入其中(在以后的置换中可能会流向
newArray
)。此外,如果您考虑在同一数组中进行交换,则此解决方案是有偏差的,因为必须在范围
[0,i]中选择随机数
获得均匀分布的排列。谢谢@amid,你部分正确。我没有创建重复项,因为我假设我正在处理原始数组。我更新了我的答案。此外,nextInt正在生成均匀分布的值,以便获得正确的排列。每个int都将均匀分布,但排列ATION本身不会。(一些解决方案比其他解决方案更有可能,这不是期望的功能)讨论此问题。(我承认这是一个有点复杂的问题,但它是一个重要的问题)。此外-解决方案仍然不起作用-(最后一行仍然是
names
,而不是
newArray
,您需要在开始之前填充
newArray
,否则-它只是一堆移动的
null
s)@在产生这样的排列时,它不会产生均匀分布的排列,但排列仍然有效。他只需要一个排列。我的回答是,排列只是为了帮助他找出代码中的问题。无论如何,谢谢,我学到了一些新东西。