2012-01-15 187 views
0

我是Ruby新手,所以答案可能很簡單。不是我雖然Loop只返回最後一個項目

我正在接受一個字符串數組(A)並將其與另一個字符串數組(B)進行匹配,以查看來自(A)的給定字符串是否存在作爲B中字符串內的子字符串。

然而,比較似乎工作,我只收回從最後一個(A)字符串比較的結果。

這可能是什麼?

def checkIfAvailableOnline(film) 

    puts "Looking for " + film 
    lowerCaseFilm = film.downcase 

    #iterate through the linesarray scanning for the film in question 

    for line in @linesArray 
     #get the line in lowercase 
     lowerCaseLine = line.downcase 

     #look for the film name as a substring within the line 
     results = lowerCaseLine.scan(lowerCaseFilm) 

     if results.length > 0 
      @availableOnlineArray << results 
     end 
    end 

end 
#----------------------------------------- 

listFilmsArray.each {|line| checkIfAvailableOnline(line)} 
+0

一些測試代碼可以幫助。你如何測試你的代碼? – 2012-01-15 15:45:29

回答

1

鑑於電影名稱的列表:

FILM_NAMES = [ 
    'Baked Blue Tomatoes', 
    'Fried Yellow Tomatoes', 
    'The thing that ate my homework', 
    'In a world where', 
] 

然後找到包含字符串的所有電影中的名字,忽略大小寫:

def find_films_available_online(partial_film_name) 
    FILM_NAMES.find_all do |film_name| 
    film_name.downcase[partial_film_name.downcase] 
    end 
end 

p find_films_available_online('tomatoes') 
# => ["Baked Blue Tomatoes", "Fried Yellow Tomatoes"] 

p find_films_available_online('godzooka') 
# => [] 

要了解電影名稱可用在線:

def available_online?(partial_film_name) 
    !find_films_available_online(partial_film_name).empty? 
end 

p available_online?('potatoes') # => false 
p available_online?('A World') # => true 

T Ø找出哪些部分電影中的名字的名單可在網上:

def partial_film_names_available_online(partial_film_names) 
    partial_film_names.find_all do |partial_film_name| 
    available_online?(partial_film_name) 
    end 
end 

p partial_film_names_available_online [ 
    'tomatoes', 
    'potatoes', 
    'A World', 
    ] 
# => ["tomatoes", "A World"] 
0

更rubyish的方式來做到這一點是:

鑑於電影裏,我們的陣列尋找:

@films = ["how to train your dragon", "kung fu panda", "avatar"] 

鑑於線的陣列,其可以含有我們正在尋找的膜:

@lines_array = ["just in kung fu panda", "available soon how to train your dragon"] 

Retur n中的電影名稱,如果它存在於早期線或虛假如果它不搜索所有行後:

def online_available(film) 
    @lines_array.each do |l| 
    l.downcase.include?(film) ? (return film) : false 
    end 
    false 
end 

檢查中拒絕該返回false的那些線的電影,打印出來並最終迴歸我們找到了一個匹配的數組:

def films_available 
    available = @films.collect{ |x| p "Looking for: #{x}"; online_available(x) } 
        .reject{ |x| x == false } 
    available.each{|x| p "Found: #{x}"} 
    available 
end 

它被認爲是不好的風格使用用Ruby方法名駝峯但你知道他們說的是什麼意見。

.each是一個內部迭代器,我很肯定「for」循環的運行速度比數組繼承的可枚舉每個方法慢。

+0

紅寶石1.9.1中''每個''比'for'快,但紅寶石1.8.7中較慢。但是,這些差異並不顯着,循環體不變的時間比循環機制多出許多個數量級。 – 2012-01-16 14:15:10