【问题标题】:Looking through an array of objects浏览一系列对象
【发布时间】:2010-10-16 20:53:59
【问题描述】:

我正在尝试编写一种方法,该方法通过对象数组查找某种颜色,这也是一个对象。

public Ghost findFirst(Color c){
        for (int i=0;i<ghosts.length;i++) {
            if (ghosts[i].getColor()==c)
            return ghosts[i];
        else
            return null;
            }  
    }

因此,如果某个幽灵的颜色与颜色 c 匹配,则返回该幽灵。但是,我收到了 i++ 的死代码警告。我的代码有什么问题?哦,我也收到一个方法错误,说这个函数应该返回一个幽灵。我以为我是?

【问题讨论】:

  • 尝试正确缩进你的代码,然后你会自己看到。但基本上,你打败了你的 for 循环,如果第一种颜色不是你想要的,你会返回 null,甚至不会查看所有其他颜色。
  • 正如我之前回答的那样,在比较 Color 对象时,您需要使用 equals()

标签: java arrays object


【解决方案1】:

因为您在第一次迭代时从循环中返回!所以“i”永远不会增加。要么完全删除 else 块,要么将“return null”更改为“continue”。

作为一个单独的点,== 是检查引用相等,而不是对象相等。您似乎应该改用“.equals”

【讨论】:

  • 我已经修改了我的答案。作为一个兴趣点,是什么给了你死代码警告?你骑?你用的是哪个?
  • 是的,我修复了 .equals 的问题。我正在使用 eclipse 并且 i++ 以黄色突出显示并带有死代码警告。如果什么也没找到,我得到了返回 null 的指示。在我的情况下,我怎样才能实现 null?
  • 此外,当我删除 else 块时,我仍然收到必须返回 Ghost 对象错误
  • fprime,您需要将 return null 移到循环之外(请参阅下面的 SKip Head 代码示例)。基本上你的逻辑需要是这样的:“我要遍历这个数组,看看能不能找到我想要的颜色的幽灵。如果我遍历了整个列表,我仍然没有返回一个幽灵,那么我应该返回 null。” ...相反,您有“对于列表中的每个幽灵,如果它是那种颜色,我将返回该幽灵,如果不是,则返回 null。”这样做的问题是您只能返回一次,并且您正在强迫自己立即返回。 (因为你在结束之前返回,所以 i++ 永远不会发生)。
【解决方案2】:

固定代码:

public Ghost findFirst(Color c){
        for (int i=0;i<ghosts.length;i++) {
            if (ghosts[i].getColor().equals(c))
               return ghosts[i];
        }
        return null;
    }

请记住,return 会终止函数(显然包括循环)。因此,如果您找到了正确的颜色幽灵 - 您将其返回(从而结束您的搜索并且永远不会到达 return null; 行)。如果你的 for 循环什么也没找到 - 你到达最后一行并返回 null。

【讨论】:

  • 哦,好吧,我不知道 return 结束了一个循环。我在上面的修复中做了一个更混乱的方法,使用布尔值,这可能不是必需的
【解决方案3】:

因为

else 
  return null;

由于该返回语句,您的循环将只执行一次。

【讨论】:

    【解决方案4】:
    public Ghost findFirst(Color c){
        for (int i=0; i < ghosts.length; i++) {
            if (ghosts[i].getColor().equals(c))
                return ghosts[i];
        }  
        return null;
    }
    

    【讨论】:

      【解决方案5】:

      如果我“展开”你的循环,代码会执行以下操作:

      public Ghost findFirst(Color c){
          if (ghosts[0].getColor()==c)
             return ghosts[0];
          else
             return null;  
      
          if (ghosts[1].getColor()==c)
             return ghosts[1];
          else
             return null; 
      
          if (ghosts[2].getColor()==c)
             return ghosts[2];
          else
             return null; 
          //etc...
      }
      

      从这里应该清楚,它永远不会到达第二个if,它会在第一个if处返回(中断函数),真或假。

      【讨论】:

        【解决方案6】:

        您的多个return 可能有问题。有时,拥有一个return 会更简单。

        public Ghost findFirst(Color c) {
            Color color = null;
            for (int i=0;i<ghosts.length;i++) {
                if (ghosts[i].getColor().equals(c))
                color = ghosts[i];
            }
            return color;   
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-01-22
          • 2010-09-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多