0

我已經查找了全部回答這個問題,我還沒有看到任何具體說明它。通過二維數組中的子數組列表增加每個其他元素到一個新數組

我寫了一個arraylist的arraylists,我需要通過所有的子列表來增加列表中的其他元素。

ArrayList<ArrayList<String>> list = new ArrayList<ArrayList<String>>(); 

int sz1=0; // how many questions in the new string array 
int ctr=0; // increment through Question to set value of index 

String [] Question = new String[sz1]; 

for(int x=0; x < list.size(); x++){ 

     sz1 = ((list.get(x).size() -1)/2); 


     for(int y=0; y < list.get(x).size(); y++){ 
      if ((y == 1) || (y % 2 == 1)){ 

       Question[ctr] = list.get(x).get(y); // throws Out of Bounds Exception: 0 
       ctr++ // add 1 for the next index 


      } 
     } 
    } 

我認爲它可能有一些做的innerloop,但我一直沒能弄明白幾個小時:因爲我已經走了這麼遠這是接近。我猜測問題是innerloop正在呼籲大小而不是索引,但我不知道如何糾正這個問題,爲一個二維數組列表。因此,最終,我試圖將父ArrayList的每個子ArrayList中的每個其他字符串存儲到新的字符串數組中。

在此先感謝您提供的任何幫助。

更新 非常感謝迄今爲止的輸入,這裏是我爲此所做的所有代碼。嘗試回答一些提出的問題,據我所知,該列表似乎填寫正確。此外,'列表數組'的輸入是一個文本文件。每個'類別'中的第一行是類別名稱,然後是問題和答案。每個類別由空行分隔。即: 類 問題 回答

新 種類 ...

我有所有這一切想通了,所以現在我需要搶在自己的ArrayList中的每個問題和答案(如@icyitscold指出,謝謝),我試圖通過僅顯示正在工作的循環來簡化它,但最好顯示所有這些循環,以便您可以看到發生了什麼(如@Dukeling指出的那樣)。

所以這裏的代碼:

`public void Read_File() throws FileNotFoundException{ 

File infile = new File("trivia.txt"); 

    String line = ""; 

    Scanner sr = new Scanner(infile); 
    int i=0; 


    ArrayList<ArrayList<String>> list = new ArrayList<ArrayList<String>>(); 


    ArrayList<String> question = new ArrayList<String>(); 


    while (sr.hasNext()){ 
     i++; 


     list.add(new ArrayList<String>()); 

     while (sr.hasNext()){  // Reads one whole category 

      line = sr.nextLine(); 
      //System.out.println(line); 

      if (line.length() == 0) 
       {break;} 

      list.get(i-1).add(line); // add line to the array list in that position 

     } 
     System.out.println(list); 

      } 


    String [] catName = new String[6]; 
for(int x=0; x < list.size(); x++){     // category array 
     catName[x] = list.get(x).get(0);} 

    for(int x=0; x < list.size(); x++){    // questions array 

     for(int y=0; y < list.get(x).size(); y++){ 
      if ((y == 1) || (y % 2 == 1)){ 
       question.add(list.get(x).get(y)); // throws OB of 0 

      } 
     } 
    } 

    System.out.println(question); 

    sr.close(); 

}` 
+0

OOB異常來自Question數組,它的大小爲0 – nitegazer2003

+0

@ nitegazer2003如果我們要將代碼作爲表面值,那麼列表也是空的,因此for循環將不會執行。 – Dukeling

+0

除非您向我們展示將項目添加到列表並增加'sz1'的缺失代碼,否則我們無法爲您提供幫助。有關更多信息,請參見[SSCCE](http://sscce.org/)。 – Dukeling

回答

1

我希望我能夠正確理解你在找什麼?你有一對夫婦的問題,您的代碼段。首先,你正在初始化大小爲零的「Question」數組 - 一旦你指定了一個數組的大小,你就不能改變它。這就是爲什麼我在代碼片段中使用ArrayList而不是String []。 ArrayLists更好,因爲不必擔心底層數組的維度,它會爲您擴展。

另請注意我如何將名爲「Question」的變量更改爲「question」 - 在java中,變量名應以小寫字母開頭。每Oracle Code Conventions document

除了變量,所有的實例,類和類常量是 大小寫混合首字母小寫

假設list正確填充,該代碼應工作:

ArrayList<ArrayList<String>> list = new ArrayList<ArrayList<String>>(); 

ArrayList<String> question = new ArrayList<String>(); 

for(int x=0; x < list.size(); x++){ 

     for(int y=0; y < list.get(x).size(); y++){ 
      if ((y == 1) || (y % 2 == 1)){ 

       question.add(list.get(x).get(y)); 

      } 
     } 
    } 

結果question ArrayList應該每隔一個字符串指定一次。

+0

如果我們將代碼作爲面值,那麼列表也是空的,因此for循環將不會執行,因此我們永遠不會到達導致異常的行。我們不知道「問題」有多大。這太小了,但我們不能說超出這個範圍。 – Dukeling

+1

這是真的,但以我的解決方案,我們永遠不需要知道「問題」有多大 - 因此,它應該有助於OP。 – icyitscold

相關問題