对于类型迭代器,Java方法未定义

时间:2018-02-01 03:06:56

标签: java iterator

我有一个Ball类和一个BallContainer类。 BallContainer类包含一个Ball对象的LinkedHashSet,名为contents。我正在编写的方法之一叫做differentColors(),顾名思义,它返回集合中不同颜色的球数的整数值。

以下是该方法代码的片段:

int count = 0;
for(Iterator<Ball> b = contents.iterator(); b.hasNext();) {
    if(b.getColor().equals(b.next().getColor())){
        count++;
    }
}

我试图通过Ball迭代器遍历列表,Eclipse IDE给出了一个错误getColor() method is undefined for type Iterator<Ball>。对我来说,这没有任何意义。 b是Ball类类型的迭代器,因此它能够访问Ball对象方法。我查看了使用Java迭代器的文档,我看到当尝试在列表或集合中打印'current'元素时,会使用.next()方法,因为迭代器在当前元素后面,所以说话。

所以我尝试将代码修改为b.next().getColor().equals(b.next().next().getColor()) 为了访问'current'元素的颜色并将其与NEXT元素的颜色进行比较。 Eclipse因为the next() method is undefined for type Ball而对我大吼大叫。有人可以向我解释发生了什么以及如何纠正这个问题?感谢

1 个答案:

答案 0 :(得分:0)

使用&#34;最后一种颜色&#34;你会好得多。变量并一次看一种颜色。此外,如果您真的想要检测颜色变化,那么您的平等测试需要被否定。如果集合按颜色排序,您可以使用以下内容:

int count = 0;
Color lastColor = null;
for (Ball ball : contents) {
    Color nextColor = ball.getColor();
    if (!nextColor.equals(lastColor)) {
        count++;
        lastColor = nextColor;
    }
}

如果以其他方式排序,您需要一些其他逻辑。我建议您保留Set<Color>

int count = 0;
Set<Color> seenColors = new HashSet<>();
for (Ball ball : contents) {
    if (seenColors.add(ball.getColor())) {
        count++;
    }
}