我有一个关于"包含"的问题java中的方法。 我有对象Tile,包括int x,int y(coordinates)和string。 我想将对象添加到队列中,没有重复。 当我说重复时,我指的是坐标。我不在乎字符串。
但是当我写这样的东西时:
for (Tile x : neighbours)
{
if (!queue.contains(x))
queue.add(x);
}
它添加全部,我的猜测是他看到一个参数不等于(字符串) 因此他把x放在队列中。
您是否知道我如何根据坐标将新对象放入队列? 两个具有相同坐标但具有不同字符串的对象对我来说是同一个对象。
感谢...
答案 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可以生成Title
和class 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;
}
...
}
方法(当你覆盖一个时,你也应该总是覆盖另一个)。