Collections.shuffle(一)魔术?

时间:2016-08-01 10:41:33

标签: java java-8

之后的魔术 的System.out.println(" *****&#34); Collections.shuffle(一);

〜$ java -version java版本" 1.8.0_101" Java(TM)SE运行时环境(版本1.8.0_101-b13) Java HotSpot(TM)64位服务器VM(版本25.101-b13,混合模式)

public static void main(String[] args) {

        List<Integer> a = Arrays.asList(1,  3,  5, 9, 14);
        Collections.shuffle(a);

        System.out.println(a);

        List<Integer> b = a.subList(0, a.size() - 1);
        List<Integer> b1 = new ArrayList<>(a.subList(0, a.size() - 1));
        System.out.println(b);
        System.out.println(b1);

        System.out.println("*****");
        Collections.shuffle(a);
        System.out.println(a);

        Collections.shuffle(b);
        System.out.println(b);

        Collections.shuffle(b1);
        System.out.println(b1);
}

[14, 1, 9, 3, 5]
[14, 1, 9, 3]
[14, 1, 9, 3]
*****
[14, 9, 3, 5, 1]
[3, 14, 9, 5]
[1, 14, 9, 3]

b shuffle(a)a.subList(0,a.size() - 1)之后的eq b; \

UPD

是的!一步步! 1)创建2)创建b子列表3)shuffle(a)为什么要随机播放(a)修改b?

UPD 2

为什么是正确的?当我改变b时,为什么会这样?我改变了一个?

中的顺序
    public static void main(String[] args) {
        List<Integer> a = Arrays.asList(1,  3,  5, 9, 14);
        Collections.shuffle(a);
        System.out.println(a);
        List<Integer> b = a.subList(0, a.size() - 1);
        System.out.println(b);
        System.out.println("*****");
        Collections.shuffle(b);
        System.out.println(a);



        System.exit(0);
}

[1, 9, 3, 5, 14]
[1, 9, 3, 5]
*****
[3, 9, 5, 1, 14]

2 个答案:

答案 0 :(得分:8)

ba view on the first 4 elements of a。如果这些元素在a中发生变化,则它们也会在b中发生变化。

所以,你最初:

  • a = {14, 1, 9, 3, 5}
  • b = {14, 1, 9, 3};

在改组a后,你有:

  • a = {14, 9, 3, 5, 1}
  • b = {14, 9, 3, 5}
另一方是

b1是一个独立列表,在a创建后对b1所做的更改对b1没有影响。

答案 1 :(得分:1)

  

b shuffle(a)a.subList(0,a.size() - 1)之后的eq b;

那是因为你在洗牌b1之后也将ba混为一谈,因此bb1都不会显示你的内容预期。相反,您应该只对 a进行随机播放,以查看b作为a子列表中的视图,在b1时采用相同的顺序作为新列表,与a的重新排序无关。

List<Integer> a = Arrays.asList(1,  3,  5, 9, 14);
List<Integer> b = a.subList(0, a.size() - 1);
List<Integer> b1 = new ArrayList<>(a.subList(0, a.size() - 1));
System.out.println(a);
System.out.println(b);
System.out.println(b1);

System.out.println("*****");
Collections.shuffle(a); // shuffle a, but do not shuffle b and b1!
System.out.println(a);
System.out.println(b);
System.out.println(b1);

输出:

[1, 3, 5, 9, 14]
[1, 3, 5, 9]
[1, 3, 5, 9]
*****
[5, 14, 1, 9, 3]
[5, 14, 1, 9]
[1, 3, 5, 9]