2014-09-05 2 views
0

Здравствуйте, у меня возникла проблема хранения массива ArrayList из целых чисел в массив ArrayList из целых чисел. Вот полный код:Java ArrayList остается пустым, когда я добавляю объект, содержащий целые числа

public class SetZeroMatrix { 

    public static void main(String [] args){ 
    ArrayList<ArrayList<Integer>> zeroMatrix = new ArrayList<ArrayList<Integer>>(); 
    ArrayList<Integer> insertionList = new ArrayList<Integer>(); 

    try { 
     FileReader in = new FileReader("matrixInput.txt"); 
     BufferedReader br = new BufferedReader(in); 
     Scanner matrixScanner = new Scanner(br); 

     while(matrixScanner.hasNextLine()){ 
      Scanner rowReader = new Scanner(matrixScanner.nextLine()); 
      while(rowReader.hasNextInt()){ 
       insertionList.add(rowReader.nextInt()); 
      } 
      //testing to see if insertionList is empty 
      System.out.println("Arraylist contains: " + insertionList.toString()); 
      zeroMatrix.add(insertionList); 
      insertionList.clear(); 
     } 
     matrixScanner.close(); 
     } 
     catch(FileNotFoundException ex) { 
      System.out.print("File not found" + ex); 
     } 
     //testing to see if zeroMatrix is empty 
     ArrayList<Integer> testList = new ArrayList<Integer>(); 
     testList = zeroMatrix.get(1); 
     System.out.println("ArrayList contains: " + testList.toString()); 
    } 

} 

Эта программа читает из текстового файла «matrixInput.txt», который содержит:

34 
20 

Проблема в том, после того, как я добавил insertionList в zeroMatrix, zeroMatrix печатает пустой ArrayList (во время последней строки кода). Я подозреваю, потому что я не правильно вставляю insertionList в zeroMatrix? Или, может быть, я печатаю его неправильно?

+1

Вы удаляете все внутри 'insertionList' после добавления его в' zeroMatrix'. Что вы ожидали от печати после этого? – csmckelvey

+0

с циклом while, вы не должны очищать insertionList, вместо этого вы должны создать новый экземпляр insertionList –

ответ

2

Вы не копируете код List, просто ссылку. Поэтому, когда вы делаете,

zeroMatrix.add(insertionList); 
insertionList.clear(); // <-- this 

Вы очистить список, добавленный к zeroMatrix. Вы можете скопировать List,

zeroMatrix.add(new ArrayList<>(insertionList)); // <-diamond operator, see below. 
insertionList.clear(); // <-- now you can clear the insertionList. 

Или вы можете переместить insertionList декларации в ваше тело цикла -

while(matrixScanner.hasNextLine()){ 
    ArrayList<Integer> insertionList = new ArrayList<Integer>(); 

В Java 7 или выше вы можете использовать алмазный оператор -

ArrayList<Integer> insertionList = new ArrayList<>(); 

Для Java 6 и ранее вам нужно было указать тип с обеих сторон, как

ArrayList<Integer> insertionList = new ArrayList<Integer>(); 
+0

Спасибо Elliott! Я неправильно думал, что insertionList создаст отдельные копии самого себя. Вы правы, мне нужно создавать новые экземпляры insertionList. – greenleaftreee

0

Проблема в вашем коде заключается в том, как вы изменяете свои переменные. Теперь insertionList - это переменная, которая должна была находиться внутри области вашего внешнего цикла while, поэтому вместо того, чтобы объявлять ее заранее и очищать ее потом или переназначать позже, просто объявите и создайте экземпляр внутри внутреннего цикла while.

public class SetZeroMatrix{ 

    public static void main(String [] args){ 
    ArrayList<ArrayList<Integer>> zeroMatrix = new ArrayList<ArrayList<Integer>>(); 

    try{ 
     FileReader in = new FileReader("matrixInput.txt"); 
     BufferedReader br = new BufferedReader(in); 
     Scanner matrixScanner = new Scanner(br); 

     while(matrixScanner.hasNextLine()){ 
      Scanner rowReader = new Scanner(matrixScanner.nextLine()); 
      ArrayList<Integer> insertionList = new ArrayList<Integer>();  
      while(rowReader.hasNextInt()){ 
       insertionList.add(rowReader.nextInt()); 
      } 
      //testing to see if insertionList is empty 
      System.out.println("Arraylist contains: " + insertionList.toString()); 
      zeroMatrix.add(insertionList); 
      insertionList.clear(); 
     } 

     matrixScanner.close(); 
    } 
    catch(FileNotFoundException ex){ 
     System.out.print("File not found" + ex); 
    } 
    //testing to see if zeroMatrix is empty 
    ArrayList<Integer> testList = new ArrayList<Integer>(); 
    testList = zeroMatrix.get(1); 
    System.out.println("ArrayList contains: " + testList.toString()); 

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