Java 如何检查列表是否包含与某个谓词匹配的元素?
我有一个ArrayList,其中包含有4个参数(x、y、iD和myType)的对象。我想验证这个ArrayList中是否有具有特定坐标的对象,独立于它们的iD和myType参数。 我想使用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
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;
}
关于浮点值的相等性检查,请参见以下内容:
,以检查每对元素是否“相等”。或者,如果您已经知道您正在寻找(3.5,4.5),您可以使用List.indexOf(Object)
获取并删除第一个对象,如果再次调用indexOf
,它返回-1
,则表示只有一个这样的对象,如果它是正整数,则表示有两个具有(3.5,4.5)的对象.这是个坏主意。他们想使用包含。如果重写等于,则必须创建一个具有垃圾id和类型的新对象。相反,他们应该迭代每个元素,只比较那些相关的属性。@M.Shaw感谢您的帮助。我不需要检查是否只有一个,我需要检查是否有一个对象具有这些坐标……使用Java 8sStream
和filter
更容易。
return myArrayList.stream().anyMatch((e) -> e.x == targetX);