2014-02-19 166 views
0

的我有一个大阵列$actor_movie_array,这是在这样的方式排序:哈希等效大阵列搜索

[actor1, movie1, movie2, movie3...] 
[actor2, movie1, movie2, movie3...] 
[actor3, movie1, movie2...] 

下面的方法获取一个参数actor_name,然后通过$actor_movie_array搜索actor_name

def search by actor(actor_name) 
    result_array = Array.new 
     $actor_movie_array.each { 
     |x| if x[0] == actor_name 
      result_array = x 
      result_array.delete_at(0) 
      break 
     end 
    } 
    return result_array 
end 

如果找到,它将被推入空数组result_array,如下所示:

result_array = [actor1, movie1, movie2, movie3...] 

然后,我将删除数组的第一个索引,在这个例子中是actor1,因为我只想让这位演员剩下的电影留在result_array

但是,这实在是效率低下。我知道哈希等价物会更有效率,但不知道如何去做。任何人都可以帮助翻译成哈希等值?

+0

你问的是如何创建一个带有“actor1”,“actor2”等的散列作为键和电影数组作为值?这看起来有点简单,但我不知道如何解释你的问题。 – Chuck

+0

是的,然后做搜索,如果actor找不到它,它会返回一个空数组。如果演员找到了,它会将该演员的所有电影保存在一个数组中。 – user3260130

+1

'search_by_actor'方法可以替换为'$ actor_movie_array.assoc(actor_name)'。[(docs)](http://www.ruby-doc.org/core-2.1.0/Array.html#method- i-assoc) – steenslag

回答

0

我会做如下

array_of_array = [ %w[actor1 movie1 movie2 movie3], 
        %w[actor2 movie1 movie2 movie3], 
        %w[actor3 movie1 movie2] 
       ] 

def search(ary,actor_name) 
    match = ary.find { |a| a.first == actor_name } 
    match.nil? ? "no actor found" : match[1..-1] 
end 

search(array_of_array,'actor2') 
# => ["movie1", "movie2", "movie3"] 

search(array_of_array,'actor5') 
# => "no actor found" 

或者,采取以下办法:

array_of_array = [ %w[actor1 movie1 movie2 movie3], 
        %w[actor2 movie1 movie2 movie3], 
        %w[actor3 movie1 movie2] 
       ] 
hsh = Hash[ary.map { |key,*val| [key,val] }] 

def search(hash,actor_name) 
    hash.fetch(actor_name,"no actor found") 
end 

search(hsh,'actor2') 
# => ["movie1", "movie2"] 

search(hsh,'actor5') 
# => "no actor found" 
+0

每次你想查看某个东西时,从数组的全部内容构造一个Hash无疑会比搜索更慢。 – Chuck

+0

@Chuck是的,你说得对。我犯了这个错误,把它放在方法里面。感谢指针。 –

0

OK,好了,假设你有形式actors_to_movies = {actor1 => [movie1, movie2, movie3], actor2 => [movie4, movie5, movie6]}的哈希值,你可以循环起来演员的电影列表与您在哈希中查找任何内容的方式相同 - 例如actors_to_movies[actor1]会给出[movie1, movie2, movie3]

如果你想弄清楚如何从你有一种形式的数组生成一个散列,你会做这样的:

actors_to_movies = Hash[ $actor_movie_array.map {|key, *vals| [key, vals] } ] 

(请注意,转化大阵成hashmap将花费比搜索数组更长的时间 - 但你最好只需要做一次。)