2012-03-23 95 views
0

這是我第一次在這裏發佈,但我迫切需要一些Java專業知識(或者也許只是另一組眼睛)。將屬性寫入二維數組

我正在寫一個ArrayList對象(結果)到一個2d數組。我正在嘗試使用嵌套循環。基本上每行都被輸入,並且檢查第一列以查看它是否與具有相同「團隊」屬性的ArrayList中的任何匹配。如果它找到一個匹配它處理它並將其刪除,它將繼續直到列表結束,然後退出以重複下一行的處理。

它似乎工作,但是當它找到一個匹配並處理它(不包括刪除它)它似乎不會繼續尋找更多的匹配內循環。

任何人都可以告訴我爲什麼它不會繼續循環?

這裏是我的代碼:

private String[][] addScores(String[][] dataTable) 
    { 
     for(int r = 0; r < dataTable.length; r++) 
     { 
      Iterator<Result> itr = outcomes.iterator(); 
      Result temp = new Result(); 
      while(itr.hasNext()) 
      { 
       temp = itr.next(); 
       //If a team is found. 
       if (dataTable[r][0] == temp.team) 
       { 
        //Increases matches played. 
        dataTable[r][1] = String.valueOf(Integer.parseInt(dataTable[r][1]) + 1); 
        if(temp.result == WIN) 
        { 
         dataTable[r][2] = String.valueOf(Integer.parseInt(dataTable[r][2]) + 1); 
        } 
        if(temp.result == DRAW) 
        { 
         dataTable[r][3] = String.valueOf(Integer.parseInt(dataTable[r][3]) + 1); 
        } 
        if(temp.result == LOSE) 
        { 
         dataTable[r][4] = String.valueOf(Integer.parseInt(dataTable[r][4]) + 1); 
        } 
        //removes entry. 
        itr.remove(); 

        break; 
       } 
      }     
     } 

     return dataTable; 
    } 

回答

1

的方式要存儲的隊名,贏得/戰平/丟失的記錄是非常尷尬的。這個怎麼樣:

創建一個Team類

public static class Team 
{ 
    String name; 
    int win; 
    int draw; 
    int lose; 
} 

放入hash map中那些球隊(用隊名作爲鍵):

Map<String,Team> map = new HashMap<String,Team>(); 

你會添加新的隊伍到地圖:

map.put(team.name, team); 

然後,當你通過迭代的結果,你需要的是:

Iterator<Result> itr = outcomes.iterator(); 
while(itr.hasNext()) 
{ 
    Result temp = itr.next(); 
    Team team = map.get(temp.team); 

    // etc... 
} 
+0

感謝您的回覆,但我之前嘗試過使用HashMap,但如果團隊名稱相同,則put方法只會找到具有相同名稱的密鑰並將其替換,因此團隊名稱必須是唯一的。 – kieranroneill 2012-03-23 03:57:40

+0

因此,您首先嚐試獲取與「團隊名稱」鍵關聯的值,如果檢索失敗,則只插入新條目。 – 2012-03-23 19:47:06

0

確保的String [] []數據表上一個R * 4二維數組,並沒有在你的日誌中的任何indexoutofboundException。

+0

謝謝你的回覆。不,似乎沒有任何indexoutofboundExceptions,它似乎只是迭代2d數組中元素的數量。這與爆炸的內循環有關! – kieranroneill 2012-03-23 03:59:31

0

你正在擺脫while循環。刪除itr.remove()後的中斷。

您還在比較字符串的地址而不是內容(當您使用==時),因此只有匹配的行中的第一個條目與結果中的字符串完全相同。如果兩個不同的String對象具有相同的內容,則==不會成立。

此外,由於您正在迭代ArrayList,因此使用for-each循環來清理您的代碼。

for(int r = 0; r < dataTable.length; r++) 
    { 
     for(Result result : outcomes) 
     { 
      //If a team is found. 
      if (dataTable[r][0].equals(result.team)) 
      { 
       //Increases matches played. 
       dataTable[r][1] = String.valueOf(Integer.parseInt(dataTable[r][1]) + 1); 
       if(result.result == WIN) 
       { 
        dataTable[r][2] = String.valueOf(Integer.parseInt(dataTable[r][2]) + 1); 
       } 
       if(result.result == DRAW) 
       { 
        dataTable[r][3] = String.valueOf(Integer.parseInt(dataTable[r][3]) + 1); 
       } 
       if(result.result == LOSE) 
       { 
        dataTable[r][4] = String.valueOf(Integer.parseInt(dataTable[r][4]) + 1); 
       } 
      } 
     }     
    } 

最後,你並不需要爲這個方法返回任何東西,如陣列(或雙陣列)的對象,可以只使用此方法爲它的側面影響。

+0

嗯,我試過了,但是它找到一個匹配後就會退出循環。在if語句中刪除元素是否會導致滿足while循環的條件? – kieranroneill 2012-03-23 03:54:45

+0

它已經工作了! 我無法表達我多麼感謝您的幫助!我花了兩個小時試圖弄清楚這一點。 – kieranroneill 2012-03-23 04:09:26

+0

如果您喜歡答案,請注意並標記爲已回答。 – beekus 2012-03-23 19:14:29

0

你的break語句實際上是打破while循環而不是if條件,所以它不會循環while循環。刪除中斷;