2016-09-15 4 views
0

Мне нужна помощь. Фактический случай здесь, код программы I будет читать несколько текстовых документов, и каждый текстовый документ имеет различное количество слов. Я хочу сохранить эти слова в 2D ArrayList, поскольку он обеспечивает динамический размер на основе существующего количества текстовых документов и слов в каждом текстовом документе.Мой выход 2D ArrayList дает кумулятивное значение?

Однако после того, как было проведено несколько испытаний, выходной сигнал не такой, как я ожидал. Чтобы сделать вещи проще, я делаю этот примерный код ссылкой. Как я использую 2D ArrayList, это то же самое, что и для реального случая.

ArrayList<List<String>> twoDWords = new ArrayList<List<String>>(); 
    List<String> oneDword = new ArrayList<String>(); 

    String word = ""; 
    String[] words = new String[5]; 

    System.out.println("Want like these(Using 2D ArrayList):"); 
    for(int i = 0; i< 5; i++) 
    { 
     System.out.print("Array - "+i +": "); 
     word += "myArray "; 
     words[i] = word; 
     System.out.println(word); 
    } 

    System.out.println("\nBut Get these output:"); 
    for(int i = 0; i< 5; i++) 
    { 
     oneDword.add(words[i]); 
     twoDWords.add(oneDword); 
     //oneDword.clear(); 
    } 

    for(int i = 0; i< twoDWords.size(); i++) 
    { 
     System.out.print("Array - "+i +": "); 
     for(int j = 0; j< twoDWords.get(i).size(); j++) 
     { 
      System.out.print(twoDWords.get(i).get(j)+" "); 
     } 
     System.out.println(""); 
    } 

Это выход: enter image description here

Результат выглядит он выдает последнее накопительное значение только повторно. Как вы можете видеть в коде, я также пытаюсь использовать метод clear() для сброса массива, но затем он дает пустое значение.

Я надеюсь, что кто-то может помочь мне в этой проблеме. Заранее спасибо ~

ответ

1

Добавление к решению Кристофера, вы должны использовать Еогеасп цикл, так как он легче читать:

for(int i = 0; i< 5; i++) 
{ 
    oneDword.add(words[i]); 
    twoDWords.add(oneDword); 
    oneDword = new ArrayList<String>(); // --> You need this since 'oneDword' contains the previous values as well and it'll keep adding new values to this list. 
    //oneDword.clear(); 
} 

for(List<String> al: twoDWords) { 
    for(String s: al) { 
    System.out.println(s); 
    } 
} 
1

Это тот самый объект массива, который хранится в каждом элементе вашего массива twoDwords. Вам нужно создать новый массив для каждого элемента вашего twoDWords массива с помощью «нового» внутри цикла:

.......... 
    for(int i = 0; i< 5; i++) 
     { oneDword = new ArrayList<String>(); //<------- 
      oneDword.add(words[i]); 
      twoDWords.add(oneDword); 
      //oneDword.clear(); 
     } 
    ......... 
1

Чтобы понять, что вы делаете неправильно, вам нужно подумать о ссылках на аргументы метода. Специально эта линия:

twoDWords.add(oneDword); 

В этой строке вы добавляете «ссылку» из oneDword в свой список twoDWords. Вы каждый раз добавляете ссылки на один и тот же oneDword. Таким образом, вы получаете размер списка 5, но все они содержат ссылки на ваш список 1Dword (который вы продолжаете расти в среднем цикле.

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