2013-11-17 3 views
4

Я попытался создать программу с 2 списками; list1 (List<Integer>), который будет постоянно добавлять новые значения и list2 (List<List<Integer>>), который сохранит значения list1. Я начал с этого:Java, использующий списки для хранения списков

int x=1; 
    while(x<=10) 
    { 
     list1.add(x); 
     System.out.println(list1); 
     x++; 
    } 

И выход был точно так же, как я думал;

[1] 
[1, 2] 
[1, 2, 3] 
[1, 2, 3, 4] 
[1, 2, 3, 4, 5] 
[1, 2, 3, 4, 5, 6] 
[1, 2, 3, 4, 5, 6, 7] 
[1, 2, 3, 4, 5, 6, 7, 8] 
[1, 2, 3, 4, 5, 6, 7, 8, 9] 
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 

тогда я изменил System.out.println(list1); к list2.add(list1);, а затем включал Enchanced цикл;

 for(List<Integer> y:list2) 
    { 
     System.out.println(y); 
    } 

Но вместо того, чтобы на выходе, как и прежде, он сказал:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 

Как он просто повторил последнее состояние list1 10 раз! Знаете ли вы, в чем причина?

ответ

4

Поскольку вы добавляете целые числа к жеList объекта на каждой итерации, а затем добавить этот объект списка в список объектов списка.

Придумайте ситуации, как это:

enter image description here Один из способов может быть:

int x=1; 
while(x <= 10){ 
    l1 = new ArrayList<>(l1);//create a new list object with values of the old one 
    l1.add(x); 
    l2.add(l1); 
    x++; 
} 
4

Списки, скорее всего, ссылаются на тот же объект List. Чтобы этого избежать, вы хотите добавить каждую итерацию new List<Integer>.

Вы могли бы сделать что-то вроде этого

int x = 1; 
while (x <= 10) { 

    int y = 1; 
    while (y <= x) { 
     List<Integer> list = new List<Integer>(); 
     list.add(y); 
     y++; 
    } 
    y = 1; 
    list2.add(list); 
} 

for (List<Integer> list: list2){ 
    System.out.println(list); 
} 
0

списки, скорее всего, ссылки на один и тот же объект списка, после добавления list1 в list2, вы изменили list1 .so list1 в списке2 также изменен.

Смежные вопросы