Collections.shuffle(a) магия?

Магия после
System.out.println("*****"); Коллекции.shuffle(a);

~$ java -version версия java "1.8.0_101" Java(TM) SE Runtime Environment (сборка 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) not eq b после a.subList(0, a.size() - 1); \

УПД

Ага! шаг за шагом! 1) создать a 2) создать b подсписок a 3) перемешать(a) Зачем перемешать(a) изменить b ?

УПД 2

Почему правильно? Почему это верно, когда я перетасовываю b я меняю порядок в a ?

    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]

person Atum    schedule 01.08.2016    source источник
comment
Мне действительно непонятно, что вы имеете в виду - ваше последнее предложение не объясняет точно, что вы ожидали или, что более важно, почему вы этого ожидали.   -  person Jon Skeet    schedule 01.08.2016
comment
В чем именно проблема? Вы задаетесь вопросом, почему перетасовка на самом деле перетасовывает коллекцию? Я имею в виду... это то, что он должен делать...   -  person Mark    schedule 01.08.2016
comment
Похоже, у вас есть три независимых списка, и вы перетасовывали каждый из них отдельно.   -  person biziclop    schedule 01.08.2016
comment
На самом деле они не независимы. b является подсписком a, поэтому он поддерживается тем же экземпляром ArrayList.   -  person Eran    schedule 01.08.2016
comment
Обратите внимание, что вы перемешиваете b и b1 перед печатью, так что даже если они сохранят тот же порядок a, то после перемешивания они будут печататься в другом порядке.   -  person tobias_k    schedule 01.08.2016


Ответы (2)


b – это просмотреть первые 4 элемента 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.

person assylias    schedule 01.08.2016
comment
Как указано здесь: docs .oracle.com/javase/8/docs/api/java/util/ - person biziclop; 01.08.2016

b после shuffle(a) not eq b после a.subList(0, a.size() - 1);

Это связано с тем, что вы также перемешиваете b1 и b после того, как вы перетасовывали a, поэтому ни b, ни b1 не отобразят того, что вы ожидали. Вместо этого вы должны перетасовать только 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]
person tobias_k    schedule 01.08.2016
comment
Ага! шаг за шагом! 1) создать a 2) создать b подсписок a 3) перемешать (a) Зачем перемешать (a) изменить b ? - person Atum; 01.08.2016
comment
thx List‹E› subList(int fromIndex, int toIndex) Возвращает представление части этого списка между указанными fromIndex, включительно, и toIndex, исключая. (Если fromIndex и toIndex равны, возвращаемый список пуст.) Возвращаемый список поддерживается этим списком, поэтому неструктурные изменения в возвращаемом списке отражаются в этом списке, и наоборот. Возвращаемый список поддерживает все необязательные операции со списком, поддерживаемые этим списком. - person Atum; 01.08.2016