Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何检查列表是否包含与某个谓词匹配的元素?_Java_Arraylist - Fatal编程技术网

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

Java 如何检查列表是否包含与某个谓词匹配的元素?,java,arraylist,Java,Arraylist,我有一个ArrayList,其中包含有4个参数(x、y、iD和myType)的对象。我想验证这个ArrayList中是否有具有特定坐标的对象,独立于它们的iD和myType参数。 我想使用Arrays.asList(yourArray).contains(yourValue)但是当对象只有一个参数时 以下是全部代码: public class MyObject { public float x; public float y; public int iD; public Str

我有一个ArrayList,其中包含有4个参数(x、y、iD和myType)的对象。我想验证这个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"));
}
公共类MyObject{
公共浮动x;
公众浮躁;
公共int iD;
公共字符串myType;
公共MyObject(浮点x、浮点y、整数iD、字符串myType)
{
this.myType=myType;
this.iD=iD;
这个.x=x;
这个。y=y;
}
@凌驾
公共字符串toString(){
返回(“[iD=“+iD+”x=“+x+”y=“+y+”type=“+myType+”]”);
}
}
ArrayList myArrayList=新建ArrayList();
无效设置()
{
尺寸(100,60);
添加(新的MyObject(3.5,4.5,6,“a”);
添加(新的MyObject(5.4,2.6,4,“b”);
}
例如,如果我想验证是否存在具有坐标(3.5、4.5)的对象,我应该如何继续? 有没有一个简单的方法可以做到这一点

感谢您的帮助

您可以覆盖等于函数来定义等于:

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+"]");
    }

    @Override
    public boolean equals(Object o) {
        if (o instanceof MyObject) {
            MyObject myObject = (MyObject) o;
            return myObject.iD == this.iD && myObject.myType.equals(this.myType);
        }

        return false;
    }
}
注意:

我必须承认这样做很危险覆盖等于如果您使用了等于进行其他比较,可能会在程序中引起奇怪的问题。但在特殊情况下,也许你可以这样做。

美国的javadoc

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

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

长格式的解决方案是迭代
列表中的元素
并单独检查它们,找到一个元素后立即返回
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;
}

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


谢谢您的回答!然后我使用myArrayList.contains((3.5,4.5))@MatthiasGrahamSlick您需要为循环嵌套
,以检查每对元素是否“相等”。或者,如果您已经知道您正在寻找(3.5,4.5),您可以使用
List.indexOf(Object)
获取并删除第一个对象,如果再次调用
indexOf
,它返回
-1
,则表示只有一个这样的对象,如果它是正整数,则表示有两个具有(3.5,4.5)的对象.这是个坏主意。他们想使用
包含
。如果重写等于,则必须创建一个具有垃圾id和类型的新对象。相反,他们应该迭代每个元素,只比较那些相关的属性。@M.Shaw感谢您的帮助。我不需要检查是否只有一个,我需要检查是否有一个对象具有这些坐标……使用Java 8s
Stream
filter
更容易。
return myArrayList.stream().anyMatch((e) -> e.x == targetX);