2012-01-15 16 views
0

私はRubyを初めて使用しているので、その答えはおそらくかなり簡単です。ループは最後の項目だけを返します

私は文字列(A)の配列をとり、文字列(B)の別の配列と照合して、(A)からの文字列がBの文字列内の部分文字列として存在するかどうかを確認します。

ザ・コンペアは、しかし、私は唯一の比較最後の(A)文字列から結果を取り戻す動作するようです。

これは何ですか?フィルム名が利用可能であるかどうかを確認するには

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') 
# => [] 

:ケースを無視して、部分文字列を含むすべての映画の名前を見つけるために、次に

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

:フィルム名のリストを考えると

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

いくつかのテストコードが役に立ちます。コードをどのようにテストしましたか? –

答えて

1

オンライン:

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"] 
:私たちが探しているフィルムの配列を考えると

Oオンラインで入手でき、部分フィルム名のリストのかを調べます

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

Retur:私たちが探しているフィルムを含めることができる行の配列を指定して

falseが返されたものを拒否するラインにおけるフィルムの

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

チェックは、それらを印刷し、最終的に戻る:Nフィルム名が早期にそれはすべての行を検索した後にしていない場合の行に存在するか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 

ルビーとメソッド名にキャメルケースを使用することが悪いスタイルと考えられていますが、彼らは意見を言うことを知っています。

.eachは、内部イテレータであり、私はループが配列の継承各メソッドを列挙よりも遅く実行されます「のために」かなり確信しています。

+0

'each'は、ruby 1.9.1では' for'より高速ですが、ruby 1.8.7では遅くなります。しかし、その違いは重要ではなく、ループ本体はループ機構よりも多くの時間をかけて変わらない。 –

関連する問題