#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>();