Arraylist внутри arraylist, как мне очистить последний

#java #arraylist

#java #arraylist

Вопрос:

Я использую цикл while для чтения текстового файла и создания новых списков массивов из частей текстового файла, а затем помещаю эти списки массивов в другой список массивов. Моя проблема в том, что я не знаю, как добавить мой временный синтаксический анализ arraylist в mainAList, а затем очистить его для следующего цикла, не затрагивая все синтаксические массивы внутри arraylist<arraylist> mainAList . Больше информации в комментариях ниже в коде.

Это пример кода, он взят из файла большего размера. Он сокращен, но имеет все движущиеся части

 ArrayList<ArrayList<String>> mainAList = new ArrayList<ArrayList<String>>();
ArrayList<String> parse = new ArrayList<>();

try (Scanner filereader = new Scanner(Paths.get("name_of_file.txt"))) {
    while (filereader.hasNextLine()) {
        parse.add(filereader.nextLine());
        if (parse.get(parse.size()-1).length() == 0 || !filereader.hasNextLine()) {
            // if the file reader detects empty line or has no more lines
            //  the arraylist called parse gets added to the mainAList
            mainAList.add(parse);
        }
        parse.clear();
        // here is my problem. How do I clear parse so for the next patch of lines
         //  so I don't add the same things   more into the next slot of mainAList
         // every time the loop runs?
         // I understand my issue is not how to correctly clear the parse but 
         // how to add the arraylists correctly into the mainAList so I can alter them individually
   }
}
  

Считываемый файл выглядит следующим образом:
a
b
c
d

f
g

h
i
j
k
l

и т.д..

Комментарии:

1. Попробуйте сделать mainAList.add(parse.copy()) это вместо этого, чтобы добавлять копию списка вместо того, чтобы добавлять сам список несколько раз. Это, или переместите строку, которую вы создаете parse внутри while цикла, так, чтобы она каждый раз создавала новую.

Ответ №1:

В вашем текущем подходе есть две проблемы:

  1. parse будет использовать одну и ту же ссылку для всех внутренних списков ArrayList, поэтому при вызове parse.clear() она очистит все ваши внутренние списки mainAList . Это можно решить, создав копию parse списка при его добавлении (т.Е. mainAList.add(new ArrayList<>(parse)); )
  2. Вы также хотите очистить список внутри if, после того как вы добавили копию в свой mainAList .

Кроме того, я предполагаю, что вы не хотите, чтобы пустые строки добавлялись в отдельные внутренние списки, поэтому вы можете сначала прочитать строку и либо добавить весь список в mainAList и очистить parse внутри if-оператора, либо добавить строку в parse -list .

Немного лучшей альтернативой является просто создание нового списка, поэтому вам не понадобится clear и создание копии списка.

Всего:

 ArrayList<ArrayList<String>> mainAList = new ArrayList<ArrayList<String>>();
ArrayList<String> parse = new ArrayList<>();

try (Scanner filereader = new Scanner(System.in)) {
  while (filereader.hasNextLine()) {
    String line = filereader.nextLine();
    if (line.length() == 0 || !filereader.hasNextLine()) {
        // if the file reader detects empty line or has no more lines
        // the arraylist called parse gets added to the mainAList
        mainAList.add(parse);
        // and then a new parse-list is created for the next group of inputs:
        parse = new ArrayList<>();
    } else{
        parse.add(line);
    }
  }
}
  

Попробуйте это онлайн.

Ответ №2:

Попробуйте это вместо того, чтобы каждый раз очищать список.

 ArrayList<ArrayList<String>> mainAList = new ArrayList<ArrayList<String>>();

try (Scanner filereader = new Scanner(Paths.get("name_of_file.txt"))) {
    while (filereader.hasNextLine()) {
        ArrayList<String> parse = new ArrayList<>();
        parse.add(filereader.nextLine());
        if (parse.get(parse.size()-1).length() == 0 || !filereader.hasNextLine()) {
         mainAList.add(parse);
        }
   }
}
  

Ответ №3:

Ваша проблема в том, что mainAList в конце ваш будет пустым, потому что объекты являются ссылочными типами. Чтобы устранить эту проблему, вы должны добавить копию parse в mainAList , а не parse в сам arraylist

замените эту строку

 mainAList.add(parse);
  

с помощью этого

 mainAList.add(new ArrayList<>(parse));