【问题标题】:Get the list from Map and filter using groovy从 Map 中获取列表并使用 groovy 进行过滤
【发布时间】:2018-07-15 12:54:02
【问题描述】:

我正在尝试根据 id 的列表从地图中获取列表,并希望根据年龄(年龄 > 35)检索值(列表)

def people = [
"1": [[name:'Bob', age: 32, gender: 'M'],[name:'Johnny', age: 36, gender: 'M']],
"3": [[name:'Claire', age: 21, gender: 'F'],[name:'Amy', age: 54, gender:'F']],
"4": [[name:'John', age: 41, gender: 'F'],[name:'Sam', age: 54, gender:'F']]
]

def id = ["1","3"]


def age = people.subMap(id).values().findAll{it.age > 35}

但是,我收到以下错误:

Cannot compare java.util.ArrayList with value '[32, 36]' and java.lang.Integer with value '35'

如何获取所有年龄> 35岁的人的名单?

【问题讨论】:

    标签: list groovy hashmap iteration


    【解决方案1】:

    你需要.flatten()people.subMap(id).values()的结果,因为它会产生一个地图列表:

    [[[name:Bob, age:32, gender:M], [name:Johnny, age:36, gender:M]], [[name:Claire, age:21, gender:F], [name:Amy, age:54, gender:F]]]
    

    当您执行people.subMap(id).values().flatten() 时,您将获得地图列表:

    [[name:Bob, age:32, gender:M], [name:Johnny, age:36, gender:M], [name:Claire, age:21, gender:F], [name:Amy, age:54, gender:F]]
    

    然后你就可以申请.findAll { it.age > 35 }

    def people = [
            "1": [[name: 'Bob', age: 32, gender: 'M'], [name: 'Johnny', age: 36, gender: 'M']],
            "3": [[name: 'Claire', age: 21, gender: 'F'], [name: 'Amy', age: 54, gender: 'F']],
            "4": [[name: 'John', age: 41, gender: 'F'], [name: 'Sam', age: 54, gender: 'F']]
    ]
    
    def id = ["1", "3"]
    
    def age = people.subMap(id).values().flatten().findAll { it.age > 35 }
    
    println age
    

    输出:

    [[name:Johnny, age:36, gender:M], [name:Amy, age:54, gender:F]]
    

    希望对你有帮助。

    【讨论】:

      【解决方案2】:

      虽然不像其他答案那样Groovy,但一个简单的方法是通过转换函数来collect,并返回[] 以表示不匹配(可以是flattened out )。

      也就是说,鉴于此:

      def people = [
      "1": [[name:'Bob', age: 32, gender: 'M'],[name:'Johnny', age: 36, gender: 'M']],
      "3": [[name:'Claire', age: 21, gender: 'F'],[name:'Amy', age: 54, gender:'F']],
      "4": [[name:'John', age: 41, gender: 'F'],[name:'Sam', age: 54, gender:'F']]
      ]
      
      def targetIds = ["1","3"]
      def targetAge = 35
      

      然后:

      def findAgeOverN = { def key, def list, def ids, def n ->
          (ids.contains(key)) ? list.findAll { it["age"] > n } : []
      }
      
      def result = people.collect { key, list -> findAgeOverN(key, list, targetIds, targetAge) }
                         .flatten()
      
      assert [[name:'Johnny', age: 36, gender: 'M'], 
              [name:'Amy', age: 54, gender: 'F']]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-01-25
        • 2019-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-25
        • 1970-01-01
        相关资源
        最近更新 更多