如何为类数组实现搜索功能

时间:2015-05-18 21:02:05

标签: arrays ruby class

我有一个User课程如下:

class User
        attr_reader   :username, :password
        def inintialize(username, password)
                @username    = username
                @password    = password
        end
end

我希望将这些User类中的许多类存储在数组中,如下所示:

users = []

def initialize_users
        user = User.new("user0", "password0")
        users.push(user)

        user = User.new("user1", "password1")
        users.push(user)
end

现在我想实现一个搜索功能,我可以通过用户名或密码进行搜索。我知道我可以迭代比较每个字段的类,如下所示:

def search(username)
        users.each do |user|
                if user.username == username then
                        puts "Found"
                        break
                end
        end
end

但是没有任何其他方法可以在没有迭代的情况下执行此操作,或者这只是最简单/最干净的方法吗?

我在想也许有办法做一些事情:

users["username_to_find"]
=> true

虽然我不确定如何实现这一点。我相信我必须重写User类才能有一个内置列表,但是从那里我迷失了。我想即使我实现了这个功能,仍然需要进行迭代。

此外,我想从该表示法中访问该用户数据,例如

users["username_to_find"].password
=> "password111"

有人有什么想法吗?

PS:User类缩减为相关代码,它实际上包含更多特定于每个用户的数据成员(如套接字),方法用于将数据发送给特定用户插座。

3 个答案:

答案 0 :(得分:0)

如果它不是一个数组,为什么不使用哈希?它提供了您想要的功能。

05-19 01:36:22.478: V/Provider/Settings(7367):  from settings cache , name = sound_effects_enabled , value = 0
05-19 01:36:22.494: D/ActivityThread(7367): hoder:android.app.IActivityManager$ContentProviderHolder@42cce4c8,provider,holder.Provider:android.content.ContentProviderProxy@42cceea0
05-19 01:36:22.606: D/Provider/Settings(7367): put string name = ringtone , value = null userHandle = 0
05-19 01:36:22.631: I/RingtoneManager(7367): Set actual default ringtone uri= null

像这样访问它

users = {}
user = User.new("user0", "password0")
users[user.username] = user

答案 1 :(得分:0)

你真的别无选择,只能迭代数组的每个元素并执行匹配测试。 users['tim_the_toolman'] # => nil, there is no user by that name users['user0'] # => returns user0 users['user0'].password # => 'password0' 是你想要使用的:

Enumberable#detect

这会返回带有匹配用户名的第一个def search(username) # return the first matching result users.detect { |user| user.username == username } end User。如果你想允许返回多个结果(例如,更多的单词" search"表示),那么你想要使用nil返回所有匹配的块:

Enumberable#select

如果您需要在多个条件上进行匹配(例如搜索用户名和名字等),则需要采用此方法。如果您搜索用户名,则上述@dax提供的解决方案是完美的。

答案 2 :(得分:0)

使用数组findselect方法。假设您按名称搜索

  1. find返回满足条件的第一个对象
  2. array.find { |user| user.name == searched_name } # will be either one User or nil, if neither has name eq to searched_name

    1. select返回满足您条件的所有对象
    2. array.select { |user| user.name == searched_name } #will be either array of Users which have name eq searched_name or an empty array when none has this name