如何检查列表是否包含与某个谓词匹配的元素?

Gra*_*ick 4 java arraylist

我有一个包含具有 4 个参数(x、y、iD 和 myType)的对象的 ArrayList。我想验证此 ArrayList 中是否存在具有特定坐标的对象,独立于它们的 iD 和 myType 参数。我想使用Arrays.asList(yourArray).contains(yourValue)但它是当对象只有一个参数时。

这是整个代码:

public class MyObject {

  public float x;
  public float y;
  public int iD;
  public String myType;


  public MyObject (float x, float y, int iD, String myType) 
  {
    this.myType = myType;
    this.iD = iD;
    this.x = x;
    this.y = y;
  }
  @Override
    public String toString() {
    return ("[iD="+iD+" x="+x+" y="+y +" type="+myType+"]");
  }
}


ArrayList<MyObject> myArrayList = new ArrayList<MyObject>();

void setup() 
{
  size(100, 60);
  myArrayList.add(new MyObject(3.5, 4.5, 6, "a"));
  myArrayList.add(new MyObject(5.4, 2.6, 4, "b"));
}
Run Code Online (Sandbox Code Playgroud)

例如,如果我想验证是否存在具有坐标 (3.5, 4.5) 的对象,我应该如何进行?是否有捷径可寻 ?

感谢您的帮助

Sot*_*lis 5

List#contains(Object)状态的 javadoc

如果此列表包含指定的元素,则返回 true。

这不是你在这里想要做的。您不是在指定元素,而是要指定元素的属性。不要使用这种方法。

长形式的解决方案是迭代 中的元素List并单独检查它们,true一旦找到,或者false当你用完元素时就返回。

public boolean findAny(ArrayList<MyObject> myArrayList, float targetX) {
    for (MyObject element : myArrayList) {
        if (element.x == targetX) { // whatever condition(s) you want to check
            return true;
        }
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

从 Java 8 开始,有一种更好的方法可以使用Stream#anyMatch(Predicate)which

返回此流的任何元素是否与提供的谓词匹配。

给定Predicate的只是对您正在寻找的属性的测试

return myArrayList.stream().anyMatch((e) -> e.x == targetX); 
Run Code Online (Sandbox Code Playgroud)

关于浮点值的相等性检查,请参阅以下内容: