【问题标题】:Checking that a field in a List of Objects has a certain value?检查对象列表中的字段是否具有特定值?
【发布时间】:2016-07-10 19:07:55
【问题描述】:

我有一个Person 对象列表:

List<Person> allPersons = new ArrayList<Person>();

Person 对象有一个名为Addressfield

我想检查列表中的至少一个人是否有某个地址 我该怎么做?

我知道在使用 HashMap 时有一个 .containsValue() 方法,但是对于 ArrayList 有什么类似的吗?

编辑:请注意,我在每个对象中搜索特定的字段值而不是对象本身?

【问题讨论】:

  • 是的,带有 if 的循环包含工作。
  • @sᴜʀᴇsʜᴀᴛᴛᴀ 你能举个例子吗
  • 你也想知道哪个Person有某个地址吗?
  • 因为 java8 流直到迭代列表

标签: java arraylist collections hashmap contains


【解决方案1】:

您必须以一种或另一种方式迭代列表。

使用 Java8 Streams 是一种方便的方法:

boolean found = allPersons.stream().anyMatch(p->p.getAddress().equals(someAddress));

【讨论】:

  • 谢谢,这相当于 Java 的顺序版本吗?
  • @java123999 在旧版本中,您必须使用循环遍历列表(例如 boolean found=false; for (Person p : allPersons()) {if (p.getAddress().equals(someAddress)) {found = true;break;}}
  • @java123999 看看这里:stackoverflow.com/questions/7481346/…
【解决方案2】:

您可以从Eclipse Collections 使用asLazy()collect()

如果可以使用MutableList接口:

MutableList<Person> allPersons = Lists.mutable.empty();
boolean found =
    allPersons.asLazy().collect(Person::getAddress).contains(someAddress);

如果您无法从List 更改 allPersons 的类型:

List<Person> allPersons = new ArrayList<>();
boolean found = 
    LazyIterate.collect(allPersons, Person::getAddress).contains(someAddress);

注意:我是 Eclipse Collections 的贡献者。

【讨论】:

    【解决方案3】:

    如果您打算经常进行此检查,请在Set&lt;String&gt; 中加载地址,然后您可以在其上调用contains 方法:

    Set<String> allAddresses = 
       allPersons.stream().map(Person::getAddress).collect(toSet());
    // ...
    boolean found = allAddresses.contains(someAddress);
    

    【讨论】:

      【解决方案4】:

      你可以简单地做while +迭代器循环

      boolean found = false;
      Iterator it = allPersons.iterator();
      Person currentPerson = null;
      
      while(!found && it.hasNext()){
          currentPerson = it.next();
          if(currentPerson != null && paramAdress.equals(person.getAddress()){
              found = true;
          }
      }
      

      【讨论】:

        【解决方案5】:

        作为补充,如果您对 Eran 的答案(这是最好的答案)感到不舒服,或者您不能使用 Java 8,只需创建如下方法:

        public boolean checkAdress(String adress)
        {
            boolean found = false;
            for(int i = 0; i < allPersons.size() && !found; i++)
                found = allPersons.get(i).getAdress().equals(adress);
            return found;
        }
        

        这是我在 Java 8 之前所做的。

        【讨论】:

        • 如果发现为真则循环退出。查看 for 内部的条件。不,我不必使用迭代符号。效率并不高。
        • 我的错!还没有意识到您的循环在正确的时间退出! :-) 也就是说,即使在 ArrayList 的情况下效率不高,for-each 循环也更具可读性。
        • 是的,但这里的问题是现代编程使用“流”的概念。这就是我们不再使用“break”、“continue”和“GOTO”的原因(或经常使用)。如果他使用 for-each 循环,他必须在方法中放置 2 个返回行。教菜鸟这些做法是不好的。
        • 根据经验,在一个方法中拥有多个return 通常不会对代码的设计或理解造成损害,除非可能是没有垃圾收集的语言。 此外,for-each 循环比处理索引的循环更易于理解且不易出错,尤其是对于初学者而言。
        • 哈哈,同意不同意。无论如何,好的做法是非常主观的,我只是在重复我的教授。
        猜你喜欢
        • 2017-06-23
        • 2015-09-03
        • 1970-01-01
        • 2012-07-13
        • 1970-01-01
        • 2020-01-02
        • 2019-07-04
        • 2021-09-18
        • 2019-12-15
        相关资源
        最近更新 更多