Как рассчитать элементы многих массивов в Ruby? - PullRequest
0 голосов
/ 16 января 2020

У меня есть вопрос о массиве в ruby

У меня есть массив, который содержит много элементов (строки в верхнем и нижнем регистре), и я хочу знать, сколько элементов (сколько строк) в этом массив содержит заглавные буквы: я получаю много элементов, но не знаю, как их вычислить, спасибо.

array.each do |arr|

  print arr.scan(/[A-Z]/)

end

Ответы [ 2 ]

2 голосов
/ 16 января 2020

По вашему примеру, что вам нужно, это матч? если вы хотите получить логический результат о том, соответствует ли элемент элементу или нет с заглавной буквой:

['foo', 'Foo', 'FoO'].each { |string| p string.match?(/[A-Z]/) }
# false
# true
# true

Вы можете использовать счетчик и передать блок, чтобы проверить, возвращает ли текущий элемент значение true при оценке, если он содержит заглавные буквы. Результатом является общее количество элементов, дающих истинное значение из блока:

['foo', 'Foo', 'FoO'].count { |string| /[[:upper:]]/ =~ string }
# 2
0 голосов
/ 16 января 2020

Итак, я сделал:

a = ["HellO", "hello", "World", "worlD"]
b = 0
a.each do |x|
  b += x.scan(/[A-Z]/).length
end
puts b   # Which equals 4 in this case

Проблема, с которой я столкнулся в некоторых из приведенных выше ответов с моим массивом. За ответ Кэри я получаю 3, в которых почему-то отсутствует одна из заглавных букв. За ответ Себастьяна я также получаю 3, в которых также почему-то отсутствует одна из заглавных букв.

В моем массиве 2 заглавные буквы в первой строке, 1 в третьей и 1 в четвертой.

Конечно, более нормальный способ ruby будет с b += x.scan(/[A-Z]/).count вместо .length, но он работает для меня в irb.

Некоторые примеры вывода с моей консоли трех методов:

030 > a.grep(/\p{Lu}/).size
 => 3 
:031 > a.count {|string| /[[:upper:]]/ =~ string}
 => 3
:026 > a.each do |x|
:027 >     b += x.scan(/[A-Z]/).length
:028?>   end
 => ["HellO", "hello", "World", "worlD"] 
:029 > b
 => 4 

Похоже, что два приведенных выше примера регулярных выражений просто проверяют наличие заглавной буквы в строке и считают ее как единое целое, так что если у вас было несколько в той же строке, что и мой первый "HellO", то он считается только как один:

:039 > ["HellO"].grep(/\p{Lu}/).size
 => 1 
:040 > ["HellO"].count {|string| /[[:upper:]]/ =~ string}
 => 1

Конечно, это может не иметь значения для вас, но если строка длиннее, чем одно слово, она может очень хорошо:

2.5.3 :045 > a = ["Hello World"]
2.5.3 :047 > a.each do |x|
2.5.3 :048 >     b += x.scan(/[A-Z]/).count
2.5.3 :049?>   end
 => ["Hello World"] 
2.5.3 :050 > b
  => 2 
2.5.3 :051 > a.count {|string| /[[:upper:]]/ =~ string}
 => 1 
2.5.3 :052 > a.grep(/\p{Lu}/).size
 => 1 

С двумя словами в одной строке вы можете увидеть разница.

Конечно, я подсчитываю общее количество заглавных букв, когда вы спросили:

i want to know how many element (how many string) in this array contains an uppercase letters

В этом случае любой из двух вышеупомянутых ответов прекрасно работает:)

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