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)@在产生这样的排列时,它不会产生均匀分布的排列,但排列仍然有效。他只需要一个排列。我的回答是,排列只是为了帮助他找出代码中的问题。无论如何,谢谢,我学到了一些新东西。