2014-12-04 4 views
0

Я пытаюсь создать родительский ArrayList, который содержит sub ArrayList для каждого из его индексов. Мой код включает в себя заполнение подписок с помощью ввода Scanner. См. Пример ввода ниже.Как поместить несколько ArrayLists внутри ArrayList Java

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

Пример ввода

2 
5 4 2 9 
1 3 3 7 

Ожидаемый результат

SubString 0 contains 5 4 2 9 
SubString 1 contains 1 3 3 7 

Описание проблемы: Я получаю сообщение об ошибке на следующей строке parentList.add(i, subList.add(q.nextInt()));. Я считаю, что я не следую синтаксису. Я пробовал использовать .addAll, но это тоже не работает. Может ли кто-нибудь сказать мне, что я делаю неправильно? Благодарим за помощь заранее.

import java.util.*; 
import java.io.*; 

public class Serials { 


    public static void main(String[] args) { 

     int T = 0; //First Integer to be inputed 
     //tells me how many sub ArrayLists I will have 

     List<List<Integer>> parentList =new ArrayList(); //parentList 
     List<Integer> subList = new ArrayList();   //subList 

     Scanner q=new Scanner(System.in); 
     System.out.println("How many substrings do we need"); 
     T = q.nextInt(); //Scanning in T Value 

     for(int i=0; i<T; i++) { 

    subList = new ArrayList<Integer>(); 
    subList.add(q.nextInt()); 
    parentList.add(i, subList); 


    } 


    System.out.println("SubString 0 contains" + parentList.get(0)); 
    System.out.println("SubString 1 contains" + parentList.get(1)); 


    } 
} 
+0

Какая ваша ошибка? Прикрепите трассировку стека. – mkobit

ответ

0
import java.util.*; 
import java.io.*; 

public class Serials { 


public static void main(String[] args) {   
    int T = 0; //First Integer to be inputed 
    //tells me how many sub ArrayLists I will have 

    List<List<Integer>> parentList =new ArrayList(); //parentList 
    List<Integer> subList = new ArrayList();   //subList 

    Scanner q=new Scanner(System.in); 
    System.out.println("How many substrings do we need"); 
    T = Integer.parseInt(q.nextLine()); //Scanning in T Value 

    for(int i=0; i<T; i++) { 
    String x = q.nextLine(); 
    String[] arr= x.split(" "); 
    subList = new ArrayList<Integer>(); 
    for(int j=0;j<arr.length;j++) 
    { 

    subList.add(Integer.parseInt(arr[j])); 

    } 
    parentList.add(i, subList); 
    } 


    System.out.println("SubString 0 contains" + parentList.get(0)); 
    System.out.println("SubString 1 contains" + parentList.get(1)); 
    } 
} 

Это позволит ввод и вывод в точном формате, который вы хотели. Надеюсь, это поможет :)

0

java.util.List boolean add(E e). Метод add возвращает boolean, а не список, поэтому вы не можете его добавить. Вы делаете это:

parentList.add(i, true/false) 

Тип parentList является List<List<Integer>>. Вы можете добавлять только элементы типа List<Integer>. Например (по крайней мере, получить его для компиляции) вы можете сделать:

subList.add(q.nextInt()); 
parentList.add(i, subList); 
+0

@CBredlow Я обновил код, используя ваше предложение, но проблема, с которой я столкнулась, заключается в том, что вход разделяется пробелами, в результате чего компиляция является 'SubString 0 содержит [5] SubString 1 содержит [4]' вместо 'SubString 0 содержит [5 4 2 9] ' Подстрока 1 содержит [1 3 3 7]' – f6e9a

0

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

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

Как это:

List<Integer> subList; 
for(int i=0; i < T; i++) { 
    subList = new ArrayList<Integer>(); 
    //logic for adding things to subList 
    parentList.add(i, subList); 
} 
0

Первая вещь, не инициализировать Подсписок во время декларации как ваш снова инициализировать его в цикл. Итак, объект new ArrayList() никогда не используется.

На ваш вопрос, почему вы делаете q.nextInt() один раз в цикле. Это означает, что вы не ожидаете более одного номера в подсписке.

Как уже упоминалось, вы не можете добавить подписок к parentList, как вы это сделали.

Я также изменил разделитель вместо, а не пространства.

Я изменил код, соблюдая эти данные.

import java.util.*; 

public class Serials { 


public static void main(String[] args) { 

    int T = 0; //First Integer to be inputed 
    //tells me how many sub ArrayLists I will have 

    List<List<Integer>> parentList =new ArrayList(); //parentList 
    List<Integer> subList = null;   //subList 
    String[] strArr = null; 

    Scanner q=new Scanner(System.in); 
    System.out.println("How many substrings do we need"); 
    T = q.nextInt(); //Scanning in T Value 

    for(int i=0; i<T; i++) { 
     System.out.println("Enter comma seperated integer values for list "+(i+1)); 
     strArr = q.next().split(","); 
     subList = new ArrayList<>(); 
     for(String str : strArr){ 
      try{ 
      subList.add(Integer.parseInt(str)); 
      }catch(NumberFormatException e){ 
       System.out.println("Are you share that was an integer?"); 
       System.exit(0); 
      } 
     } 
     parentList.add(i, subList); 
     } 
     parentList.add(i, subList); 
    } 


    System.out.println("SubString 0 contains" + parentList.get(0)); 
System.out.println("SubString 1 contains" + parentList.get(1)); 


    } 
} 
Смежные вопросы