Цикл возвращает только последний элемент - PullRequest
0 голосов
/ 15 января 2012

Я новичок в Ruby, поэтому ответ, вероятно, довольно прост. Не для меня, хотя

Я беру массив строк (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)} 

Ответы [ 2 ]

1 голос
/ 15 января 2012

Имеется список названий фильмов:

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

Чтобы узнать, какой из списка частичных названий фильмов доступен онлайн:

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 голосов
/ 16 января 2012

Более рубиновый способ сделать это:

Учитывая массив фильмов, которые мы ищем:

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

Учитывая массив строк, которые могут содержать фильмы, которые мы ищем:

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

Вернуть название фильма раньше, если оно существует в строке, или false, если оно не найдено после поиска по всем строкам:

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 будет выполняться медленнее, чем перечисляемый каждый метод, который наследуют массивы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...