2016-02-27 1 views
1

Я пытаюсь вставить список целых чисел в другой список, но кажется, что я ошибаюсь, мой вывод не подходит, кто-нибудь может помочь? Вы также можете комментировать http://goo.gl/xdLP9HСписок List, но по результату не подходит

public class ListInsideList { 
public static void main(String[] args) { 
    List<List<Integer>> newList = new ArrayList<List<Integer>>(); 
    List<Integer> tempList = new ArrayList<Integer>(); 
    List<Integer> originalList = new ArrayList<Integer>(); 
    for (int i = 1; i <= 10; i++) { 
     originalList.add(i);//adding values to list 
    } 
    for(Integer value : originalList){ 
     tempList.add(value); 
     if(tempList.size()==5) 
     { 
      newList.add(tempList); 
      System.out.println("iteration:"+newList); 
      tempList.clear();//clearing list 
     } 
    } 
    System.out.println("final:"+newList); 

    } 
} 

Выход:

iteration:[[6, 7, 8, 9, 10], [6, 7, 8, 9, 10]] 
final :[[], []] 
required is:iteration:[[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]] 
final:[[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]] 
+0

Кстати, если мой ответ действительно решить, это вежливо, чтобы пометить его как «принято» , Благодарю. – Stewart

ответ

4

Ваш окончательный ответ требует ли 2 отдельные списки.

  • [1, 2, 3, 4, 5] // List One
  • [6, 7, 8, 9, 10] // List Two

Так где же вы создаете эти два отдельных списка? Вы этого не сделаете, вы просто повторно используете тот же самый tempList на каждой итерации. Добавление tempList к другому List не разводит его с именем переменной «tempList», который является ссылкой на тот же объект, который вы тогда clear().

Вместо clear() создайте новый каждый раз:

  • Вместо tempList.clear(); //clearing list
  • Используйте tempList = new ArrayList<>(); // new List
+2

Thanx решил мою проблему, но я не понимаю, почему это случилось. Это не тот случай, когда мы очищаем список, как создание нового только может у вас объяснить, пожалуйста, – ashish

+2

А? Очистив «Список», вы опорожняете его, а затем повторно используете его для второй итерации. Когда вы добавляете 'tempList' в список списков' newList', он сохраняет ссылку на тот же объект, который вы затем очищаете. Вам нужно создать совершенно новый 'List' – Stewart

+0

Это не то же самое. Когда вы делаете 'newList.add (templist)', вы фактически добавляете ссылку на тот же объект templist на newList, а не на него. Таким образом, когда вы его очищаете, он очищается везде, где есть – DDsix

1

Вы можете заменить newList.add(tempList); с:

1.

note: для этого вам необходимо, чтобы tempList был ArrayList (для List не является сериализуемым);

newList.add(SerializationUtils.clone(tempList)); 
templist.clear(); 

2.

List<Integer> list = new ArrayList<>(newList.size()); 
list.addAll(newList); 
newList.add(list); 
newList.clear(); 
+1

Спасибо, что он сработал, но с помощью клонирования im Финал: [[], [1, 2, 3, 4, 5], [], [6, 7, 8, 9, 10], [], [ 11, 12, 13, 14, 15], [], [16, 17, 18, 19, 20]] с некоторым пустым элементом aslo ' – ashish

+0

Возможно, вы забыли удалить newList.add (tempList); линия? – DDsix

1

Ваши списки пусты в итоговом заявлении для печати.Там нет ничего для того, чтобы печатать, так как списки пусты, как показано на рисунке,

 System.out.println("final:"+newList.get(0).isEmpty()); 

и

System.out.println("final:"+newList.get(1).isEmpty()); 

так вместо того, чтобы попытаться,

ArrayList<ArrayList<Integer>> newList = new ArrayList<ArrayList<Integer>>(); 
    ArrayList<Integer> tempList = new ArrayList<Integer>(); 
    ArrayList<Integer> originalList = new ArrayList<Integer>(); 
    ArrayList<ArrayList<Integer>> finalList = new ArrayList<ArrayList<Integer>>(); 

    for (int i = 1; i <= 10; i++) { 
     originalList.add(i);//adding values to list 
    } 

    for(Integer value : originalList){ 
     tempList.add(value); 
     if(tempList.size()==5) 
     { 
      newList.add(tempList);    
      System.out.println("iteration:"+newList); 
      finalList = newList; 
     } 

    } 
    System.out.println("final:"+finalList); 
0

вы можете сделать что-то подобное для минимален нагрузка:

изменение

newList.add(tempList) 

в

newList.add(newArrayList<Integer>(tempList)); 

для того, чтобы скопировать TempList и не используя его ссылка

for(Integer value : originalList){ 
     tempList.add(value); 
     if(tempList.size()==5) 
     { 
      newList.add(new ArrayList<Integer>(tempList)); 
      System.out.println("iteration:"+newList); 
      tempList.clear();//clearing list 
     } 
    } 
    System.out.println("final:"+newList); 
+0

Стоит объяснить, какую линию вы изменили, и почему – Stewart

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