очистить список массивов в java

#java #arraylist

#java #список массивов

Вопрос:

я пытаюсь создать 2D ArrayList, когда я принимаю данные и сохраняю их в одном arraylist, затем добавляю их в 2d arraylist, поэтому я очищаю единый список массивов в каждом цикле и сохраняю новую строку проблема в очистке данных, это очищает всю предыдущую строку и просто сохраняет самую новую enter code here

 public class main6 {

    public static void main(String[] args) throws IOException {
        Scanner scan = new Scanner(System.in);
        InputStreamReader in = new InputStreamReader(System.in);
        BufferedReader b = new BufferedReader(in);
        int arrCol= scan.nextInt();     
        ArrayList<ArrayList<String>> arr = new ArrayList<ArrayList<String>>();
        ArrayList<String> x = new ArrayList<String>();
        
    for(int i = 0 ; i < arrCol ; i  ) { 
        
        
        x.addAll(Arrays.asList(b.readLine().split("\s"))); 
        arr.add(i,x);   
        x.clear();
    } 
         System.out.println(Arrays.deepToString(arr.toArray()));
    }

} 
  

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

1. Чего вы пытаетесь достичь?

2. эта проблема в HackerRank ( hackerrank.com/challenges/java-arraylist/problem )

3. Во-первых, вы уверены, что понимаете проблему, что она запрашивает ? Возможно, я ошибаюсь, но ваш вопрос кажется мне довольно запутанным и неясным.

4. я только на первом этапе решения проблемы, когда я сохраняю данные

Ответ №1:

Пара вещей.

  • Наилучшей практикой является присвоение типу интерфейса вместо реализации. И вы неправильно объявляете свой «2D» список массивов. Итак
     List<List<String>> arr = new ArrayList<>();
  
  • Нет необходимости использовать вспомогательный список. Просто сделайте это следующим образом:
     for(int i = 0 ; i < arrCol ; i  ) {         
        arr.add(Arrays.asList(b.readLine().split("\s")));
    }
  
  • Если вы все еще хотите создать явную ArrayList<> реализацию, то передайте выходные данные Arrays.asList в качестве аргумента. Нет необходимости использовать add или addAll.
     for(int i = 0 ; i < arrCol ; i  ) {         
        arr.add(new ArrayList<>(Arrays.asList(b.readLine().split("\s"))));
    }

  
  • Нет необходимости преобразовывать в массив и выполнять глубокое преобразование строк. Спискам это не нужно.
     System.out.println(arr);
  

Примечание: Одно исключение из первого маркера. Иногда List реализация обладает большей функциональностью в терминах, methods которых нет в List interface . В этом случае, если вы хотите эту функциональность, вам нужно назначить тип реализации, а не тип интерфейса. С List интерфейсами я не могу вспомнить, чтобы мне приходилось это делать.

Ответ №2:

Создайте список в цикле for, чтобы у вас был новый экземпляр для каждого добавления:

 for(int i = 0 ; i < arrCol ; i  ) { 
    ArrayList<String> x = new ArrayList<String>();
    ...
  

… кроме того, не очищайте его впоследствии…

Ответ №3:

Обновите цикл for для создания экземпляра списка массивов:

 for(int i = 0 ; i < arrCol ; i  ) { 
    
    ArrayList<String> x = new ArrayList<>();
    x.addAll(Arrays.asList(b.readLine().split("\s"))); 
    arr.add(i,x);   
   
} 
  

Таким образом, список массивов будет воссоздаваться для каждого цикла, и нет необходимости его очищать.

Затем вы можете удалить создание экземпляра arraylist в теле метода перед циклом for:

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