【问题标题】:collection findall in an array list在数组列表中收集 findall
【发布时间】:2013-11-05 14:49:45
【问题描述】:

我正在使用 groovy 并且我有一个集合:

  • 人 1:年龄 - 1,体重 - 25
  • 第 2 人:年龄 - 2,体重 - 20
  • 第 3 人:年龄 - 3,体重 - 25

我需要找到所有年龄或体重在名为 getValidAgeForSchool() 或 getValidWeightForSchool() 的方法返回的有效年龄/体重列表中的人。年龄 [2,3] 或体重 [20,25]

我知道有这样的东西(也不行)

persons.findAll{ it.age == 2 || it.weight == 20}

但我怎么说(比如 IN 子句)

persons.findAll {it.age in [2,3] || it.weight in [20,25]}

我也试过这个(暂时忽略重量)但没有在应该返回的时候返回列表 persons.age.findAll{ it == 2 || it == 3}

谢谢。

【问题讨论】:

    标签: collections groovy find


    【解决方案1】:

    你的代码有效:

    def people = [
        [ id: 1, age: 1, weight: 25 ],
        [ id: 2, age: 2, weight: 20 ],
        [ id: 3, age: 3, weight: 25 ]
    ]
    
    // This will find everyone (as everyone matches your criteria)
    assert people.findAll {
               it.age in [ 2, 3 ] || it.weight in [ 20, 25 ]
           }.id == [ 1, 2, 3 ]
    

    如果您有这样的实例列表,它也可以工作:

    class Person {
        int id
        int age
        int weight
    }
    
    def people = [
        new Person( id: 1, age: 1, weight: 25 ),
        new Person( id: 2, age: 2, weight: 20 ),
        new Person( id: 3, age: 3, weight: 25 )
    ]
    

    我假设你的问题是你有 weight 作为双精度或什么?

    如果重量是double,您需要这样做:

    people.findAll { it.age in [ 2, 3 ] || it.weight in [ 20d, 25d ] }.id
    

    但是小心,这是在做双重等式比较,所以如果你对权重做任何算术,你可能会成为舍入和准确性错误的牺牲品

    【讨论】:

    • 重量是双倍的,我按原样硬编码输入了 [20,25]。我再次尝试了代码,但它没有给我任何应该的结果。 tnx
    • @user742102 添加了重量为双倍的示例和警告
    • 好的。知道了。你是对的,我在比较相同的值但没有指定类型。 IN其实只是一个猜测,甚至不知道它的存在。我在这里阅读了整个文档 -> groovy.codehaus.org/JN1015-Collections 并且我没有看到使用它的示例。它现在正在工作。谢谢:)
    猜你喜欢
    • 2019-05-21
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 2013-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多