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

检查arraylist是否包含属性为[duplicate]的对象

萧宣
2023-03-14

我试图使用一种方法来检查一个数组列表是否包含一个带有属性的对象。

public class Network {
    // this variable is instantiated and set by the constructor
    private ArrayList<Person> persons;

    /**
     * Constructor for objects of class Network
     */
    public Network() {
        // initialize instance variables
        persons = new ArrayList<>();
        persons.add(new Person("name1"));
        persons.add(new Person("name2"));
    }

这是我目前拥有的,但我无法让它发挥作用。

public Person lookupPerson(String personName) {
    boolean personContain = persons.contains(new Person(personName));

    if (personContain == true) {
        System.out.println("ye");
    } else {
        System.out.println("nah");
    }

    return null;
}

共有3个答案

邢皓
2023-03-14

如果您使用的是Java8,那么就使用谓词。在predicte中,可以使用给定条件筛选arraylist,然后检查结果arraylist大小是否为零。这样你就可以找到有或没有prooEntry的对象。

程赞
2023-03-14

您的方法不起作用的原因是List#contains(文档)方法使用Person#equals的结果来确定列表中的元素是否与参数相同。如果尚未实现此方法,则它会在Person的继承树中搜索该方法。由于每个对象都继承自类对象,如果在通往对象的路上没有类实现了等于,那么您将退回到对象#等于(文档)。然而,这个Object#等于方法通过对象的身份(放在内存中)来比较对象。这意味着,如果您创建的对象具有相同的属性(如名称等),则该对象将只是一个副本,但与列表中的副本不同。

请注意,在StackOverflow中有许多关于此主题的问题。如果你不熟悉它,你应该去看看。这里有一个例子更详细地解释了它:在Java中重写equals和hashCode时应该考虑哪些问题?

解决这个问题有多种方法。让我们首先考虑一个非常简单易行的方法。

我们手动迭代列表并检查与相关参数相关的每个条目。

public Person lookupPerson(String personName) {
    for (final Person person : persons) {
        // Access properties of person, usage of getter methods would be good
        if (person.name.equals(personName)) {
            // Found matching person
            return person;
        }
    }

    // Traversed whole list but did not find a matching person
    return null;
}

(如@DeepakS的答案所示)

现在,我们使用list#indexOf(文档)让列表执行迭代和匹配部分。这种方法与您的包含(文档)的方法类似,但我们也希望获取元素,而不仅仅是检查元素是否存在。

public class Person {
    ...

    @Override
    public boolean equals(final Object o) {
        if (o == null) {
            return false;
        }
        if (!(o instanceof Person)) {
            return false;
        }
        if (o == this) {
            return true;
        }

        final Person other = (Person) o;
        return other.name.equals(this.name);
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;

        result = prime * result;
        if (this.name != null) {
            result += this.name.hashCode();
        }

        return result;
    }
}

以及查找方法:

public Person lookupPerson(String personName) {
    // The needle to search for
    final Person needle = new Person(personName);

    // The needle will now be equals to list objects
    // regarding its equals method which only checks
    // for the name

    final int index = persons.indexOf(needle);
    if (index != -1) {
        // Get the element at this position
        return persons.get(index);
    } else {
        return null;
    }
}

(如@AxelH的答案所示)

如果你有Java8,你可能更喜欢一个非常紧凑的变体。因此,我们使用Stream#filter(留档),它根据方法是否返回true或false(所谓的谓词(留档))来过滤流的元素。所以我们只需要在那里实现一个名称检查,就完成了。

public Person lookupPerson(String personName) {
    return list.stream()
        .filter(p -> p.name.equals(personName))
        .findAny();
}

(如@GaneshToni的回答所示)

萧成文
2023-03-14

阅读ArrayList.containsdoc。

如果此集合包含指定的元素,则返回true。更正式地说,当且仅当此集合包含至少一个元素e,使得(o==null?e==null:o.equals(e))返回true。

它将使用参数equals方法,它是在Person中定义的吗?可能不是,所以它将使用Object.equals来检查引用,而不是实例内容。

创建如下方法

class Person {
     ...
     @Override
     public boolean equals(Object o){
         if(o instanceof Person){
              Person p = (Person) o;
              return this.name.equals(p.getName());
         } else
              return false;
     }
}
 类似资料:
  • 我想检查像下面这样的JSON对象中的某个键是否包含某个值。假设我想检查任何对象中的键“name”是否具有值“blofeld”(这是真的)。我怎么能那样做?

  • 本文向大家介绍检查Java ArrayList是否包含给定项,包括了检查Java ArrayList是否包含给定项的使用技巧和注意事项,需要的朋友参考一下 java.util.ArrayList.contains()方法可用于检查Java ArrayList是否包含给定项。此方法具有单个参数,即测试了其在ArrayList中是否存在的项目。如果该项目在ArrayList中存在,则返回true;如果

  • 我想找到属性中的是否包含某个值。然后我想获取包含该值的条目的索引。

  • 问题内容: 有什么方法可以检查一个集合是否包含一个或多个具有比使用contains循环两次更好的性能的值? 在其他意义上看起来像这样 问题答案: 循环的实现遍历每个元素并进行测试,因此调用两次 效率低下 。 您可以编写自己的循环,使用已编译的regex 模式同时检查两者,同时查找两个名称:

  • 请看do while循环,我认为注释是不言自明的。我想检查该集合是否设置了所有具有符号a、b、c、d的卡片(借助数组或其他任何东西实现它)。