Using and Querying Struct

I’m trying to use the Stuct class to store some data. In my case, a
bunch of data. But, in simplistic terms I’ve come up with the following
example of what I’m looking for.

class Mailinglist <
Struct.new(:f_name, :l_name, :city)
end

As an example, let’s say I have two people John S. and Jane Smith who
live in Smithville. Is there an easy way to query an array containing
Structs to determine of :l_name, and :city of with the array match and
only produce one item from the array?

I know you could sort the array so all the data is sorted on l_name and
then city. That would give you some order to the data:

#<Struct Mailinglist f_name=“Mike”, l_name=“Jones”, city=“Pineville”>
#<Struct Mailinglist f_name=“Jane”, l_name=“Smith”, city=“Smithville”>
#<Struct Mailinglist f_name=“John”, l_name=“Smith”, city=“Smithville”>
#<Struct Mailinglist f_name=“Sally”, l_name=“Taulton”, city=“Ashville”>

but would you have to iterate through the array to find all the matches
to city, then l_name? I wouldn’t think so, but I’m not sure how else to
do it at this point.

Wayne

Am 05.01.2013 13:40, schrieb Wayne B.:

I’m trying to use the Stuct class to store some data. In my case, a
bunch of data. But, in simplistic terms I’ve come up with the
following example of what I’m looking for.

class Mailinglist < Struct.new(:f_name, :l_name, :city) end

There is no need to subclass, just use

Mailinglist = Struct.new(:first_name, :last_name, :city)

(Btw, your class name is misleading, `ListMember’ would be
more accurate.)

As an example, let’s say I have two people John S. and Jane Smith
who live in Smithville. Is there an easy way to query an array
containing Structs to determine of :l_name, and :city of with the
array match and only produce one item from the array?

data = [
Mailinglist.new(‘Mike’, ‘Jones’, ‘Pineville’),
Mailinglist.new(‘Jane’, ‘Smith’, ‘Smithville’),
Mailinglist.new(‘John’, ‘Smith’, ‘Smithville’),
Mailinglist.new(‘Sally’, ‘Taulton’, ‘Ashville’)
]

matches = data.select {|member| member.city == ‘Smithville’ &&
member.last_name == ‘Smith’ }
matches.first

=> #<struct Mailinglist first_name=“Jane”, last_name=“Smith”,

city=“Smithville”>

Regards,
Marcus

Am 05.01.2013 15:16, schrieb [email protected]:

matches = data.select {|member| member.city == ‘Smithville’ &&
member.last_name == ‘Smith’ }
matches.first

=> #<struct Mailinglist first_name=“Jane”, last_name=“Smith”,

city=“Smithville”>

If you really need only the first match, you can use #find instead of
#select:

first_match = data.find {|member| member.city == ‘Smithville’ &&
member.last_name == ‘Smith’ }

Wow, thanks Marcus!

I think will work perfectly for my needs. I’ve got a situation where I
have register addresses that are identical, but are used differently,
but the list I retrieve requires me to do some additional checks to
determine what’s what. I struggled with how to deal with this, so I
looked at the Struct class to store things in an array, so I could pull
out the needed info, but then couldn’t quite wrap my head around how I
could query the entire array without iterating through it.

Thanks for the help!

Wayne