#ruby
#ruby
Вопрос:
Я новичок в ruby. У меня есть массив строк, подобных этому [«a b c», «d e f»], и у меня есть строка, подобная этой «xapqbrc». Я хочу проверить, содержит ли «xapqbrc» все слова в каждой строке, но не обязательно одно рядом с другим. Как я могу это сделать в ruby?
["a b c", "d e f"].include? "xapqbrc"
работает не так, как ожидалось
Комментарии:
1. Под «всеми словами в каждой строке» вы подразумеваете «все буквы»? Значит, она будет соответствовать первой, но не второй?
Ответ №1:
include?
просто проверяет, равен ли какой-либо объект любому объекту в массиве. ["a b c", "d e f"].include? "xapqbrc"
будет иметь значение true только в том случае, если вся строка "xapqbrc"
находится в массиве.
Разделив это на две части, сначала проверьте, содержит ли одна строка все слова в другой. Сначала разделите строку слов на массив.
words = "a b c".split(/ /) # ["a", "b", "c"]
Теперь мы можем использовать include?
but для строки, чтобы проверить, содержит ли строка другую строку. "food".include?("foo")
верно. Но это только для одного слова, нам нужно сделать это для всех слов. Используется all?
для проверки, является ли вещь истинной для всех элементов в массиве.
words.all? { |word| "xapqbrc".include?(word) }
Наконец, нам нужно сделать это для массива этих слов. Мы можем использовать select
для получения только тех элементов в массиве, для которых блок имеет значение true.
# ["a b c"]
matches = ["a b c", "d e f"].select { |string|
words = string.split(/ /)
# The last statement in the block determines the truthiness of the block.
words.all? { |word| "xapqbrc".include?(word) }
}
Ответ №2:
Чтобы проверить, все ли символы в строке встречаются в массивах строк:
('xapqbrc'.chars - ['a b c', 'd e f'].map(amp;:chars).flatten).empty?
# => false
Вот разбивка приведенного выше утверждения.
Метод chars
возвращает массив всех символов в строке. Обратите внимание, что для строки с пробелами этот массив будет включать пробелы. Если вы хотите извлечь символы, разделенные пробелами или, в более общем смысле, пробелами, используйте split
like so (как в ответе Шверна):
['a b c', 'd e f'].map{ |s| s.split(/ /) }.flatten
Метод берет массив массивов и объединяет его в один массив. flatten
puts 'xapqbrc'.chars.inspect
# => ["x", "a", "p", "q", "b", "r", "c"]
puts ['a b c', 'd e f'].map(amp;:chars).flatten.inspect
# => ["a", " ", "b", " ", "c", "d", " ", "e", " ", "f"]
puts ('xapqbrc'.chars - ['a b c', 'd e f'].map(amp;:chars).flatten).inspect
# => ["x", "p", "q", "r"]
puts ('xapqbrc'.chars - ['a b c', 'd e f'].map(amp;:chars).flatten).empty?
# => false
Еще несколько примеров:
strings1 = ['a b c', 'd e f']
['xapqbrc', 'accbbb', 'xpq', ' ', ''].each do |string2|
puts "string2=#{string2};"
puts (string2.chars - strings1.map(amp;:chars).flatten).empty?
end
# => string2=xapqbrc;
# => false
# => string2=accbbb;
# => true
# => string2=xpq;
# => false
# => string2= ;
# => true
# => string2=;
# => true