繁体   English   中英

无法随机化 java 字符串数组

[英]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; , strstrTmp都是对同一个数组的引用。 因此,在放入元素时,您将覆盖旧元素,包括尚未移动的元素。

你可能只是做

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

查看在 IdeOne 中实时运行的两个代码片段

如果您不想更改数组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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM