当前位置: 首页 > 知识库问答 >
问题:

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

谢财
2023-03-14

我有一个包含有4个参数(x,y,iD和myType)的对象的ArrayList。我想验证这个ArrayList中是否有具有特定坐标的对象,独立于它们的iD和myType参数。我想使用Arrays.as列表(your Array)。包含(your Value)但当对象只有一个参数时。

以下是全部代码:

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

例如,如果我想验证是否有一个具有坐标(3.5,4.5)的对象,我应该如何继续?有没有简单的方法

谢谢你的帮忙

共有2个答案

祁鸿哲
2023-03-14

您可以重写equals函数来定义equal:

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;
    }
}

注意:

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

路和悌
2023-03-14

List#的javadoc包含(Object)状态

如果此列表包含指定的元素,则返回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;
}

从Java8开始,有一种更好的方法可以使用Stream#anyMatch(谓词)来实现这一点

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

其中,给定的谓词只是对您要查找的属性的测试

return myArrayList.stream().anyMatch((e) -> e.x == targetX); 

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

  • 在Java中使用==来比较浮动有什么问题
 类似资料:
  • 以下是更详细的错误消息: 我将代码中的问题隔离在下面的某个地方,尽管我不知道抛出这个异常的具体原因: gradle.build-项目

  • 问题内容: 我想要一种惯用的方式来找到与谓词匹配的列表中的第一个元素。 当前代码非常丑陋: 我已经考虑过将其更改为: 但是必须有一些更优雅的方法……如果返回一个值而不是没有找到匹配项引发异常,那将是一个很好的选择。 我知道我可以像这样定义一个函数: 但是,如果已经有内置的插件开始用这样的实用函数填充代码,这是很鸡肋的(人们可能不会注意到它们已经在那里,因此随着时间的推移它们会不断重复出现)。 问题

  • 问题内容: 我有两个带有不同对象的列表。 我想检查list2中的元素是否存在于list2中,基于特定的属性(Object1和Object2具有(以及其他),一个共有属性(类型为Long),名为attributeSame)。 现在,我这样做是这样的: 但是我认为有一种更好,更快的方法可以做到这一点:)有人可以提出吗? 谢谢! 问题答案: 如果只需要测试基本相等性,则可以使用基本JDK来完成,而无需在

  • 我有两个不同对象的列表。 我想根据特定的属性(Object1和Object2有一个共同的属性(类型为Long),名为AttributeName),检查list2中是否存在list1中的元素。 现在,我是这样做的: 但我认为有更好更快的方法可以做到这一点:)有人能提出吗? 谢谢

  • 它们大多是下划线,但有时有一个元素不是下划线。我只想处理那些有“内容”的。目前,我使用for-loops检查是否存在非下划线元素。有没有更有效率的办法?

  • 问题内容: 我有这样的df: 以及物品清单: 我的目标是从中获取至少包含2个元素的所有行。 我想出了以下解决方案: 这给了我我想要的,但是就可伸缩性而言,它可能不是最佳的解决方案。是否有任何“向量化”解决方案?谢谢 问题答案: 我会建立一个Series列表,然后应用vectorized : 它给出了预期的结果: