2012-03-23 66 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循环。删除中断;