[英]Fail to randomize java string array
我想使用下面的代码随机化或打乱字符串数组的顺序
public static void main(String[] args) {
String str[]= {"Vxds", "Cvda", "Xcgi", "Atdr", "Mbeds", "0bda"};
String strTmp[]=str;
ArrayList<Integer> list = new ArrayList<Integer>();
for (int i=0; i<str.length; i++) {
list.add(new Integer(i));
}
Collections.shuffle(list);
for (int i=0; i<str.length; i++) {
strTmp[i]=str[list.get(i)];
System.out.println(strTmp[i]);
}
}
我这样做而不是直接打印出来的原因是因为我想稍后将它变成 function。 这就是我将它传递给 strTmp[] 的原因,因为这就是我希望 function 返回的原因。 但是,代码并没有像我预期的那样 function 。 它打印出几个相同的值。 我怎样才能以正确的方式做到这一点? 感谢你的回答...
您几乎拥有它,但是您两次引用了同一个数组并交换了它的内容。 更改此行
String strTmp[] = str;
至
String strTmp[] = new String[str.length];
当你做String strTmp[]=str;
, str
和strTmp
都是对同一个数组的引用。 因此,在放入元素时,您将覆盖旧元素,包括尚未移动的元素。
你可能只是做
String str[]= {"Vxds", "Cvda", "Xcgi", "Atdr", "Mbeds", "0bda"};
Collections.shuffle(Arrays.asList(str));
这是因为Arrays.asList()
不会创建新列表,它只是提供数组的列表视图。 对列表的任何更改都会更改数组。 包括洗牌。 编辑:这适用于字符串数组和任何其他引用类型的数组。 正如 WJS 指出的那样,这对于基元数组(例如int[]
)不起作用,因为Arrays.asList(arrayOfPrimitives)
将创建一个新创建的一个元素数组的列表视图,即原始数组。
如果您需要一个新数组,其中包含经过改组的字符串且旧数组未修改,则解决方案是:
List<String> list = new ArrayList<>(Arrays.asList(str));
Collections.shuffle(list);
String[] newStr = list.toArray(new String[0]);
System.out.println("Original array: " + Arrays.toString(str));
System.out.println("New shuffled array: " + Arrays.toString(newStr));
编辑:来自一个示例运行的 Output:
Original array: [Vxds, Cvda, Xcgi, Atdr, Mbeds, 0bda] New shuffled array: [0bda, Cvda, Mbeds, Vxds, Xcgi, Atdr]
如您所见,原始数组未修改。
编辑:由于 Java 11 使用Collection.toArray(IntFunction<String[]>)
创建新数组更好:
String[] newStr = list.toArray(String[]::new);
如果您不想更改数组str
。 尝试这个。
String str[] = {"Vxds", "Cvda", "Xcgi", "Atdr", "Mbeds", "0bda"};
String strTmp[] = str.clone();
Collections.shuffle(Arrays.asList(strTmp));
System.out.println(Arrays.toString(strTmp));
output
[Xcgi, Cvda, Atdr, Mbeds, 0bda, Vxds]
我了解您希望在每次执行中随机化您的数组。 这是此代码。
import java.util.*;
public static void main(String[] args) {
String str[]= {"Vxds", "Cvda", "Xcgi", "Atdr", "Mbeds", "0bda"};
List<String> list =Arrays.asList(str);
Collections.shuffle(list);
System.out.println(list);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.