2012-01-15 4 views
0

저는 Ruby를 처음 사용하기 때문에 대답이 매우 간단합니다. 아니지만 내게루프는 마지막 항목 만 반환합니다.

문자열의 배열 (A)을 가져 와서 다른 문자열 배열 (B)과 비교하여 (A)의 주어진 문자열이 B 문자열의 부분 문자열로 존재하는지 확인합니다.

그러나 비교가 작동하는 것처럼 보입니다. 나는 마지막 (A) 문자열의 결과 만 비교합니다.

이것은 무엇입니까? 무시하는 경우, 그 다음

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 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 O 부분 필름 이름의 목록 중 어느 것이 온라인으로 사용할 수 있습니다 찾을 :

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 :

우리가 찾고있는 영화를 포함 할 수 있습니다 라인의 배열을 감안할 때 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는 내부 반복기이며 "for"루프가 상속받은 각 메서드의 열거 형보다 느리게 실행됩니다.

+0

'each'는 루비 1.9.1에서는'for'보다 빠르지 만 루비 1.8.7에서는 느립니다. 그러나 차이점은 중요하지 않지만 루프 본체는 루핑 메커니즘보다 많은 시간이 소요됩니다. –

관련 문제