Подтвердить что ты не робот

Добавить ArrayList в другой массив ArrayList в java

У меня есть следующий java-код, в котором я пытаюсь скопировать ArrayList в другой ArrayList.

 ArrayList<String> nodes = new ArrayList<String>();
 ArrayList NodeList=new ArrayList();
 ArrayList list=new ArrayList();

        for(int i=0;i<PropertyNode.getLength()-1;i++){
            Node childNode =  PropertyNode.item(i);
                NodeList Children = childNode.getChildNodes();

                if(Children!=null){
                    nodes.clear();
                    nodes.add("PropertyStart");
                    nodes.add(Children.item(3).getTextContent());
                    nodes.add(Children.item(7).getTextContent());
                    nodes.add(Children.item(9).getTextContent());
                    nodes.add(Children.item(11).getTextContent());
                    nodes.add(Children.item(13).getTextContent());
                    nodes.add("PropertyEnd");

                }   
                NodeList.addAll(nodes);
                list.add(NodeList);
        }

Я хочу, чтобы массив "list" был в этом формате:

[[PropertyStart,a,b,c,PropertyEnd],[PropertyStart,d,e,f,PropertyEnd],[PropertyStart,......]]

Но из вышеприведенного кода вывод массива "list" выглядит следующим образом:

[PropertyStart,a,b,c,PropertyEnd,PropertyStart,d,e,f,PropertyEnd,PropertyStart,....PropertyEnd]

Я думаю, вы могли заметить разницу. Я не могу добиться результата в ожидаемом формате. Пожалуйста, предложите мне любое решение! Спасибо заранее!

4b9b3361

Ответ 1

Затем вам понадобится ArrayList ArrayLists:

ArrayList<ArrayList<String>> nodes = new ArrayList<ArrayList<String>>();
ArrayList<String> nodeList = new ArrayList<String>();
nodes.add(nodeList);

Обратите внимание, что NodeList было изменено на NodeList. В Соглашения о назначении Java переменные начинаются с нижнего регистра. Классы начинаются с верхнего регистра.

Ответ 2

Ваша проблема

В основном у вас есть две основные проблемы:

Вы используете добавление List из String s. Вы хотите List, содержащий List Strings.

Обратите также внимание на то, что при вызове:

NodeList.addAll(nodes);

... все, что вы говорите, заключается в том, чтобы добавить все элементы узлов (которые представляют собой список строк) к (плохо названному) NodeList, который использует объекты и, таким образом, добавляет только строки внутри. Это приводит меня к следующему пункту.

Кажется, вы смущены между nodes и NodeList. Ваш NodeList продолжает расти с течением времени и что вы добавляете в свой список.

Итак, даже если все будет правильно, если мы посмотрим на конец каждой итерации на ваших nodes, NodeList и List, мы увидим:

  • i = 0

    nodes: [PropertyStart,a,b,c,PropertyEnd]
    nodeList: [PropertyStart,a,b,c,PropertyEnd]
    list: [[PropertyStart,a,b,c,PropertyEnd]]
    
  • i = 1

    nodes: [PropertyStart,d,e,f,PropertyEnd]
    nodeList: [PropertyStart,a,b,c,PropertyEnd, PropertyStart,d,e,f,PropertyEnd]
    list: [[PropertyStart,a,b,c,PropertyEnd],[PropertyStart,a,b,c,PropertyEnd, PropertyStart,d,e,f,PropertyEnd]]
    
  • i = 2

    nodes: [PropertyStart,g,h,i,PropertyEnd]
    nodeList: [PropertyStart,a,b,c,PropertyEnd,PropertyStart,d,e,f,PropertyEnd,PropertyStart,g,h,i,PropertyEnd]
    list: [[PropertyStart,a,b,c,PropertyEnd],[PropertyStart,a,b,c,PropertyEnd, PropertyStart,d,e,f,PropertyEnd],[PropertyStart,a,b,c,PropertyEnd,PropertyStart,d,e,f,PropertyEnd,PropertyStart,g,h,i,PropertyEnd]]
    
  • и т.д.

Некоторые другие исправления

Следуйте соглашениям о присвоении имен Java

Не используйте имена переменных, начиная с прописных букв. Итак, замените NodeList на NodeList).

Узнайте немного больше о типах

Вы говорите: "Я хочу массив" list "[...]". Это смущает того, с кем вы будете общаться: это не массив. Это реализация List, поддерживаемая массивом.

Существует разница между типом, интерфейсом и реализацией.

Использовать Generics для более сильного ввода в коллекциях

Использовать общие типы, поскольку статическая типизация действительно помогает с этими ошибками. Кроме того, используйте интерфейсы, где это возможно, за исключением случаев, когда у вас есть веская причина использовать конкретный тип.

Итак, ваш код будет выглядеть следующим образом:

List<String> nodes = new ArrayList<String>();
List<String> nodeList = new ArrayList<String>();
List<List<String>> list = new ArrayList<List<String>>();

Удалить ненужный код

Вы можете полностью удалить NodeList и написать следующее после того, как вы исправили свои типы:

list.add(nodes);

Использовать правую область

Кроме того, если у вас есть очень сильная причина для этого, предпочитайте использовать внутреннюю область видимости для объявления переменных и ограничивать их продолжительность их ссылок и облегчать разделение проблем в коде.

Здесь вы можете переместить List<String> nodes для объявления в цикле (а затем запустите вызов nodes.clear()).

Причиной этого не может быть производительность, так как вам может потребоваться избежать воссоздания ArrayList на каждой итерации цикла, но очень маловероятно, чтобы вас беспокоили (и чистые, читаемые и поддерживаемые код имеет приоритет над предварительно оптимизированным кодом).

SSCCE

И последнее, но не менее важное: если вы хотите помочь нам получить точный воспроизводимый случай с коротким, самосогласованным, правильным примером.

Здесь вы даете нам свои программные выходы, но не упоминайте, как вы их получили, поэтому нам остается предположить, что вы сделали System.out.println(list). И вы путаете много людей, так как я думаю, что вы даете нам то, что вы на самом деле не получили.

Ответ 3

Не будет ли это просто:

ArrayList<ArrayList<String>> outer = new ArrayList<ArrayList<String>>();
ArrayList<String> nodeList = new ArrayList<String>();

// Fill in nodeList here...

outer.add(nodeList);

Повторите, если это необходимо.

Это должно вернуть вам список в указанном вами формате.

Ответ 4

У вас возникла проблема в том, что вы используете тот же ArrayList NodeList по всем итерациям в цикле main for. Каждая итерация NodeList увеличивается новыми элементами.

  • После первого цикла NodeList имеет 5 элементов (PropertyStart, a, b, c, PropertyEnd) и список имеет 1 элемент (NodeList: (PropertyStart, а, б, в, PropertyEnd))

  • После второго цикла NodeList имеет 10 элементов (PropertyStart, a, b, c, PropertyEnd, PropertyStart, d, e, f, PropertyEnd) и list имеет 2 элемента (NodeList (с 10 элементами), NodeList (с 10 элементами))

Чтобы оправдать ожидания, вы должны заменить

NodeList.addAll(nodes);
list.add(NodeList)

по

List childrenList = new ArrayList(nodes);
list.add(childrenList);

PS. Ваш код не читается, сохраняйте коды кода Java для чтения кода. Например, трудно распознать, является ли NodeList классом или объектом

Ответ 5

Инициируйте NodeList внутри цикла for, и вы получите желаемый результат.

ArrayList<String> nodes = new ArrayList<String>();
 ArrayList list=new ArrayList();

        for(int i=0;i<PropertyNode.getLength()-1;i++){
            ArrayList NodeList=new ArrayList();
            Node childNode =  PropertyNode.item(i);
                NodeList Children = childNode.getChildNodes();

                if(Children!=null){
                    nodes.clear();
                    nodes.add("PropertyStart");
                    nodes.add(Children.item(3).getTextContent());
                    nodes.add(Children.item(7).getTextContent());
                    nodes.add(Children.item(9).getTextContent());
                    nodes.add(Children.item(11).getTextContent());
                    nodes.add(Children.item(13).getTextContent());
                    nodes.add("PropertyEnd");

                }   
                NodeList.addAll(nodes);
                list.add(NodeList);
        }

Объяснение: NodeList - это объект, который остается таким же во всем цикле, поэтому добавление одной и той же переменной в список в цикле фактически добавит ее только один раз. Цикл добавляет только переменные в единый массив NodeList, поэтому вы должны видеть

[/*list*/    [  /*NodeList*/   ]   ]

и NodeList содержит [prostart, a, b, c, proend, prostart, d, e, f, proend...]

Ответ 6

Вначале будет объявлен внешний Arraylist, который будет содержать другой внутренний Arraylist внутри него

ArrayList > CompletesystemStatusArrayList; Система ArrayListStatusArrayList

CompletesystemStatusArrayList = новый ArrayList

systemStatusArrayList = new ArrayList();

    systemStatusArrayList.add("1");
    systemStatusArrayList.add("2");
    systemStatusArrayList.add("3");
    systemStatusArrayList.add("4");
    systemStatusArrayList.add("5");
    systemStatusArrayList.add("6");
    systemStatusArrayList.add("7");
    systemStatusArrayList.add("8");

    CompletesystemStatusArrayList.add(systemStatusArrayList);