user742102
user742102

Reputation: 1365

collection findall in an array list

I am using groovy and I have a collection :

I need to find all persons whose age or weight is in the list of valid age/weight returned by a method called getValidAgeForSchool() or getValidWeightForSchool() ex. ages [2,3] or weight [20,25]

I know there is something like this (not working too)

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

but how I can say (like the IN Clause)

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

I also tried this (ignoring the weight for now) but not returning the list when it is supposed to persons.age.findAll{ it == 2 || it == 3}

thanks.

Upvotes: 3

Views: 14492

Answers (1)

tim_yates
tim_yates

Reputation: 171074

The code you have works:

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 ]

It also works if you have a list of instances like so:

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 )
]

I'm assuming your problem is that you have weight as a double or something?

If weight is a double, you'd need to do:

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

But beware, this is doing double equality comparisons, so if you are doing any arithmetic on the weight, you may fall victim to rounding and accuracy errors

Upvotes: 9

Related Questions