Как перебрать несколько строк в массиве - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть массив строк.

a = "Apple Banana oranges grapes. free free free phones. deals deals time.black white grey"
b = a.split(/\./)

Я хочу проверить, присутствует ли слово "free" или "deals" в каждой строке, и сосчитать и сохранить его в новом массиве.

c = 0
d = 0
g = Array.new
t = Array.new
b.each do |i|
  if /free/.match(i)
    t.push i
    c = c + 1
  elsif /deals/.match(i)
    t.push i
    d = d + 1
  else
    g.push i
  end
end
p d
p c
p g
p t

Но это не показывает точное количество.Есть ли другой способ анализа строки внутри массива?

Ответы [ 3 ]

0 голосов
/ 28 ноября 2018

Ваш подход подсчитывает предложения, а не вхождения слова в совпавших предложениях.Используйте c += i.split.count "free" для подсчета фактических вхождений слова "free".Избегайте использования однобуквенных имен переменных, если их значение не ясно.

Однако все это выглядит немного лишним;Вы можете выполнять подсчет и выбирать / отклонять элементы, соответствующие шаблону, используя методы встроенного массива :

a = "Apple Banana oranges grapes. free free free phones. deals deals time.black white grey"

p a.split(".").grep /\bfree\b|\bdeals\b/
p a.split(".").reject {|e| e =~ /\bfree\b|\bdeals\b/}
p a.split.count "free"
p a.split.count "deals"

Вывод:

[" free free free phones", " deals deals time"]
["Apple Banana oranges grapes", "black white grey"]
3
2

Попробуйте!

0 голосов
/ 28 ноября 2018

Возможно решение, которое следует вашему исходному коду:

a = "Apple Banana oranges grapes. free free free phones. deals deals time.black white grey"
b = a.split(/\W+/)

c = 0
d = 0
g = Array.new
t = Array.new
b.each do |i|
  if i == "free"
    t.push i
    c = c + 1
  elsif i == "deals"
    t.push i
    d = d + 1
  else
    g.push i
  end
end

puts "Original words: #{b}"
puts "Counts of 'free': #{c}"
puts "Counts of 'deals': #{d}"
puts "Array of matches: #{t}"
puts "Array of non matches: #{g}"

И вывод:

# Original words: ["Apple", "Banana", "oranges", "grapes", "free", "free", "free", "phones", "deals", "deals", "time", "black", "white", "grey"]
# Counts of 'free': 3
# Counts of 'deals': 2
# Array of matches: ["free", "free", "free", "deals", "deals"]
# Array of non matches: ["Apple", "Banana", "oranges", "grapes", "phones", "time", "black", "white", "grey"]


Пример подсчета с использованием инструментов Ruby:
counts = {}
a.split(/\W+/).tap { |b| b.uniq.map { |w| counts[w.downcase] = b.count(w) } }
counts #=> {"apple"=>1, "banana"=>1, "oranges"=>1, "grapes"=>1, "free"=>3, "phones"=>1, "deals"=>2, "time"=>1, "black"=>1, "white"=>1, "grey"=>1}

Затем вы можете получить доступ к данным, например:

counts.keys #=> ["apple", "banana", "oranges", "grapes", "free", "phones", "deals", "time", "black", "white", "grey"]
counts['free'] #=> 3
counts['deals'] #=> 2
counts.select { |_, v| v > 1} #=> {"free"=>3, "deals"=>2}
0 голосов
/ 28 ноября 2018

С небольшим изменением имени и некоторыми хитростями scan вместо соответствия, это может сработать?

a = "Apple Banana oranges grapes. free free free phones. deals deals time.black white grey"
sentences = a.split(/\./) # Split on `.`

# Initialize variables
free_count = 0
deal_count = 0
no_match = []
matches = []

sentences.each do |i| # Go through each sentence
  if (m = i.scan(/free/)) && m.any? # Try matching "free", and check if there is any matches
    matches << i # Add match to matches array
    free_count += m.length # Count up amounts of `free` spotted.
  elsif (m = i.scan(/deals/)) && m.any? # Try matching "deals", and check if there is any matches
    matches << i # Add match to matches array
    deal_count += m.length # Count up amounts of `deals` spotted.
  else
    no_match << i # Count up for nothing spotted
 end
end

p free_count #=> 3
p deal_count #=> 2
p no_match #=> ["Apple Banana oranges grapes", "black white grey"]
p matches #=> [" free free free phones", " deals deals time"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...