2016-07-11 4 views
0

У меня есть ArrayList из ArrayList (alal) и ArrayList (al). Я хочу вставить al для alal, но я хочу, чтобы alal.get (0) содержал все, что у al, плюс добавленный элемент 100. Я подумал, что самый простой способ сделать это, прежде всего сделатьСоздание ArrayList из ArrayList, имеющего один дополнительный элемент по сравнению с другим ArrayList из ArrayList

alal.add (al);

, а затем получить доступ к его 0th элемент, и добавить 100, как

alal.get (0) .Add (100);

Однако проблема заключается в том, что содержимое al также изменяется, так как это объект, и поэтому alal имеет ссылку, а не значение.

Я пробовал ниже. Скажите, пожалуйста, если это правильный способ сделать это или предложить улучшения.

import java.util.ArrayList; 

public class additionalal { 
    public static void main(String[] args) { 
     ArrayList<ArrayList<Integer>> alal = new ArrayList<ArrayList<Integer>>(); 
     ArrayList<Integer> al = new ArrayList<Integer>(); 
     al.add(1);al.add(2);al.add(3); 

     //WRONG 
//  alal.add(al); 
//  alal.get(0).add(100); 

     //CORRECT 
     ArrayList<Integer> alextra = new ArrayList<Integer>(); 
     alextra.addAll(al); 
     alextra.add(100); 
     alal.add(alextra); 

     System.out.println(alal); 
     System.out.println(al); 
    } 
} 
+1

В чем проблема? –

+0

Если вы хотите, чтобы alal.get (0) возвращал содержимое списка al, тогда вы должны вставить al (на самом деле его копию) в элемент 0: 'alal.add (0, al)' –

ответ

2

Оберните свой список в новый ArrayList при добавлении, таким образом, клонированием:

alal.add(new ArrayList<>(al)); 
alal.get(0).add(100); 

Примечание хотя, что элементы списка не клонировали с ним. Это нормально, если у вас есть списки Integer s, но может привести к непредвиденному поведению при хранении элементов типа с динамическими свойствами. Например, рассмотрим вы хотите сохранить List из List х Person с:

class Person { 
    String name = ""; 

    public String getName() { 
     return this.name; 
    } 

    public void setName(String otherName) { 
     this.name = otherName; 
    } 

    public String toString() { 
     return "Person[name=" + this.name + ']'; 
    } 
} 

Теперь я создаю Person, поместите его в Listpersons, то я положил копию persons, скажем, personGroups :

Person user = new Person(); 
user.setName("saltandwater"); 

List<Person> persons = new ArrayList<>(); 
persons.add(user); 

List<List<Person>> personGroups = new ArrayList<>(); 
personGroups.add(new ArrayList<>(persons)); 

Печать оба списка приведет к чему-то вроде

persons: [Person[name=saltandwater]] 
personGroups: [[Person[name=saltandwater]]] 

Теперь, добавление нового Person в persons не изменит personGroups. Но, так как user не был клонирован (только persons список был клонирован), изменения в user.name будут отражены в обоих списках:

user.setName("Mr. Yetti"); 

приведет к

persons: [Person[name=Mr. Yetti]] 
personGroups: [[Person[name=Mr. Yetti]]] 
+0

спасибо, что это очень хороший. Но что вы имеете в виду, когда говорите: «Обратите внимание, что элементы списка не клонированы». Я вижу весь элемент в alal, т. Е. [[1, 2, 3, 100]]. – saltandwater

+0

@saltandwater: расширенный ответ. Это не особенно актуально в вашей ситуации, но все равно неплохо иметь в виду. – hoefling

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