Создать новый пустой список в списке списков - PullRequest
1 голос
/ 23 апреля 2020

Что я пытаюсь сделать с этим кодом, так это то, что он дает пользователю выбор между 2 элементами в списке, и выбранный элемент переносится в новый список в списке списков. Я просто хотел знать, правильна ли реализация создания моего нового списка или нет. У меня есть другая не связанная ошибка в программе, поэтому я не могу проверить, работает реализация или нет.

public static void compareTwo(List<List<String>> list){
       int result;
        for (int j = 0;j<list.size();j++) {
            if ((list.get(j).size() / 2) % 2 == 0) {
                for (int i = 0; i < list.get(j).size(); i = +2) {
                    String x = list.get(j).get(i);// gets stuff inside the inner list
                    String y = list.get(j).get(i+1);
                    System.out.println("1 ("+x+") or 2 ("+y+")" );
                    result = Integer.valueOf(scan.nextLine());

                    list.add(j + 1, new ArrayList<String>() {
                    });// add another inner list to biglist

                    list.get(j+1).clear();//clears the new inner list

                    if (result==1){
                        String z = list.get(j).get(i);
                        list.get(j+1).add(z);
                    }
                    else{
                        String z = list.get(j).get(i+1);
                        list.get(j+1).add(z);
                    }


                }
    }

Ответы [ 3 ]

2 голосов
/ 23 апреля 2020

Я вижу две серьезные проблемы в вашем коде:

  1. Поскольку следующая строка пытается получить доступ к значению по индексу i + 1, for l oop должно быть for (int i = 0; i < list.get(j).size() - 1; i = +2) чтобы избежать IndexOutOfBoundsException. В вашем коде это, for (int i = 0; i < list.get(j).size(); i = +2).
String y = list.get(j).get(i+1);
В следующей строке вы не обрабатываете исключения для случаев, когда пользователь вводит нецелое значение.
result = Integer.valueOf(scan.nextLine());

Это должно быть похоже на

boolean valid;
do {
    valid = true;
    try {
        result = Integer.parseInt(scan.nextLine());
    } catch (NumberFormatException e) {
        System.out.println("This is not an integer. Please try again.");
        valid = false;
    }
} while (!valid);

Помимо этих двух серьезных проблем, вторая строка в следующем фрагменте кода не имеет смысла, так как в новом добавленном внутреннем списке нет элементов для очистки

list.add(j + 1, new ArrayList<String>() {});// add another inner list to biglist    
list.get(j+1).clear();//clears the new inner list
2 голосов
/ 23 апреля 2020
list.add(j + 1, new ArrayList<String>() {
});// add another inner list to biglist

list.get(j+1).clear();//clears the new inner list

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

Таким образом, вы можете уменьшить этот код до:

list.add(j + 1, new ArrayList<>());
0 голосов
/ 23 апреля 2020

Вы можете использовать эту версию для простоты и читабельности

List<String> inner = new ArrayList<>();
list.add(j + 1, inner);

или некоторых java двойных инициализаций

list.add(j + 1, new ArrayList<>(){{ 
  add("hello"); 
  add("world");
}});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...