2014-02-19 114 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將花費比搜索數組更長的時間 - 但你最好只需要做一次。)