【问题标题】:Check if some object in ArrayList fulfills some condition检查 ArrayList 中的某些对象是否满足某些条件
【发布时间】:2011-10-07 02:15:12
【问题描述】:

我有一个ArrayList<Person> persons。我想检查某些人是否满足条件。点赞:person.isFemale()

除了循环列表之外,还有更好的方法来执行此操作吗?也许是某种映射或 lambda 方式?

编辑:

您好,感谢您的回复!

我想我问错了问题.. 我想检查列表中的任何对象是否与其他对象不同: boolean different = (if isMale() && isFemale()) 列表中的某处。

【问题讨论】:

  • 请不要在问题中添加诸如“问候菲利普”之类的噪音。

标签: java lambda mapping arraylist conditional-statements


【解决方案1】:

我会推荐 Guava(正式的 Google Collections),特别是 Iterables.any 来测试单个实例是否匹配条件或 Iterables.all 来测试所有实例是否匹配条件。您可以将谓词设置为匹配某个逻辑表达式或测试所有元素都等于列表的头部。

这并没有做任何花哨的事情,但它至少让你养成了以函数式风格编写代码的习惯。

【讨论】:

    【解决方案2】:

    你可以使用Guava:

    List<Person> persons = ...;     
    
    List<Person> matchingUsers = Collections2.filter(persons, new Predicate<Person>() {
    
        @Override
        public boolean apply(Person person) {
            return person.isFemale();
        }
    });
    
    if (!matchingUsers.isEmpty()) {
        ...
    }
    

    【讨论】:

    • 我更喜欢Iterables.any 而不是Collections2.filter,这样您就不必在找到第一个匹配项后评估整个列表。
    【解决方案3】:

    我不熟悉 Guava,但无论如何你都会使用 Iterables.any“循环列表”。 如果您的Person 条件在列表中时从未改变,请使用 ArrayList 的自定义子类(或其他列表实现)并检查插入方法中的条件。

    【讨论】:

    • 如果列表头部符合条件,则Iterables.any会在1次比较后返回。对于正态分布的数据,这是 O(n/2) 而不是 O(n)
    【解决方案4】:

    您为什么要“循环列表”来查找有关 Person 实例的信息 - 如果您有对 Person 的引用,只需使用它即可。我只能假设你的意思是说:

    如何找到符合特定条件的 Person 实例?

    如果是这样,您可以使用比较器对列表进行排序,该比较器对 isFemale() 低的 Persons 进行排序,因此它们会进入列表的头部,然后您可以循环直到 person.isFemale() 为 false,如下所示:

    List<Person> persons = ...; 
    Collections.sort(list, new Comparator<Person>() {
        public int compare(Person o1, Person o2) {
            return o1.isFemale().compareTo(o2.isFemale()); // Note: Assumes isFemale returns Boolean, not boolean. Otherwise, wrap before comparing.
        }
    });
    
    for (Person person : persons) {
        if (!person.isFemale()) {
            break;
        }
        // Do something with females
    }
    

    注意:这不是一个的主意,因为它会比以通常的方式遍历列表要慢,但是我试图按照所述回答问题。

    【讨论】:

    • 您好,感谢您的回复!我想我问了错误的问题。我想检查列表中的任何对象是否与其他对象不同:布尔不同 = (if isMale() && isFemale()) 列表中的某处。问候菲利普
    • 这更糟糕,列表可能被遍历两次。
    • 我同意!我没有说这会表现得很好,但我正在努力解决 OP 问题,试图给他一些符合问题的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2018-05-05
    • 1970-01-01
    • 1970-01-01
    • 2014-11-14
    • 2020-12-06
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    相关资源
    最近更新 更多