java-contains但具有特定参数

时间:2014-11-17 10:16:40

标签: java collections contains

我有一个关于"包含"的问题java中的方法。 我有对象Tile,包括int x,int y(coordinates)和string。 我想将对象添加到队列中,没有重复。 当我说重复时,我指的是坐标。我不在乎字符串。

但是当我写这样的东西时:

for (Tile x : neighbours)
{
    if (!queue.contains(x))
        queue.add(x);
}

它添加全部,我的猜测是他看到一个参数不等于(字符串) 因此他把x放在队列中。

您是否知道我如何根据坐标将新对象放入队列? 两个具有相同坐标但具有不同字符串的对象对我来说是同一个对象。

感谢...

4 个答案:

答案 0 :(得分:0)

要检查与属性匹配的元素,如果不相等,则最简单的方法是使用循环。但是,如果要使用单个方法,则可以将lambda作为谓词传递给anyMatch

for (Tile x : neighbours) {
    if (!queue.stream().anyMatch(t -> x.x == t.x && x.y == t.y)) {
        queue.add(x);
    }
}

答案 1 :(得分:0)

我已经完成了这个功能。我虽然有一个短暂的魔法"。

public static boolean containsCoordinates (LinkedList<Tile> queue, Tile obj)
{
    for (Tile queueTile : queue)
    {
         if (queueTile.getX()==obj.getX())
         {
             if (queueTile.getY()==obj.getY())
                 return true;
         }
    }

    return false;
}                

非常感谢....

答案 2 :(得分:0)

如果你想使用一些“魔法”,那么你可以考虑以下测试:

for (Tile x : neighbours) {
    if (!queue.contains(new Object() {
        public boolean equals(Object t) {
            return x.x == ((Tile) t).x && x.y == ((Tile) t).y;
        }
    })) {
        queue.add(x);
    }
}

我没有将给定的平铺t传递给contains方法,而是将Object实例传递给equals方法。这是有效的,因为contains接受任何类型的对象。

从程序逻辑来看,这个版本相当于@Joe

给出的答案

答案 3 :(得分:-1)

来自java.util.Collection的文档(定义{{​​1}}方法并且是Queue的超接口):

  

contains

     

如果此collection包含指定的元素,则返回true。更正式地说,当且仅当此集合包含至少一个boolean contains(Object o)元素e时才返回true。

因此,请覆盖(o==null ? e==null : o.equals(e))的{​​{1}}方法以满足您的需求。 E.g。

equals

Eclipse或IntelliJ Idea等IDE可以生成Titleclass Tile { ... @Override public boolean equals(Object o) { if (o == null || !(o instanceof Title)) { return false; } if (this == o) { return true; } return this.x == o.x && this.y == o.y; } ... } 方法(当你覆盖一个时,你也应该总是覆盖另一个)。