【问题标题】:Writing attributes to an two dimensional array将属性写入二维数组
【发布时间】:2012-04-07 16:39:02
【问题描述】:

这是我第一次在这里发帖,但我急需一些 Java 专业知识(或者可能只是另一双眼睛)。

我正在将对象(结果)的 ArrayList 写入二维数组。我正在尝试使用嵌套循环。基本上输入每一行并检查第一列以查看它是否与 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;
    }

【问题讨论】:

    标签: java loops nested multidimensional-array


    【解决方案1】:

    您存储球队名称和赢/平/输记录的方式非常尴尬。这个怎么样:

    创建一个团队类

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

    将这些团队放入哈希映射中(使用团队名称作为键):

    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...
    }
    

    【讨论】:

    • 谢谢你的回复,但是我之前试过HashMap,但是如果团队名称相同,那么put方法会简单地找到具有相同名称的键并替换它,因此团队名称必须是唯一的。
    • 那么您首先尝试获取与键“团队名称”关联的值,然后如果检索失败则仅插入新条目。
    【解决方案2】:

    确保 String[][] dataTable 是 R * 4 2d 数组,并且您的日志中没有任何 indexoutofboundException。

    【讨论】:

    • 感谢您的回复。不,似乎没有任何 indexoutofboundExceptions,它似乎只是遍历了 2d 数组中的元素数量。这与该死的内循环有关!
    【解决方案3】:

    你的break语句实际上是打破while循环而不是if条件,所以它不会循环while循环。删除中断;

    【讨论】:

      【解决方案4】:

      您正在跳出 while 循环。在itr.remove();之后去掉break;

      您还比较了字符串的地址而不是内容(当您使用 == 时),因此您只有匹配行中的第一个条目与结果中的字符串对象完全相同。如果两个不同的 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);
                      }
                  }
              }                   
          }
      

      最后,你不需要为这个方法返回任何东西,因为数组(或双数组)是对象,这个方法可以用于它的副作用。

      【讨论】:

      • 嗯,我试过了,但它仍然会在找到匹配项时退出循环。在 if 语句中删除元素是否会导致满足 while 循环的条件?
      • 成功了!!我无法表达我多么感谢您的帮助!我花了整整 2 个小时试图弄清楚这一点。
      猜你喜欢
      • 2017-01-03
      • 1970-01-01
      • 2012-10-07
      • 2018-03-08
      • 1970-01-01
      • 2014-07-01
      • 2012-09-11
      • 2012-08-09
      • 2011-06-06
      相关资源
      最近更新 更多