Узнайте, сколько элементов содержат числа в массиве - PullRequest
0 голосов
/ 12 января 2019

Я пытаюсь выяснить, сколько элементов в массиве дескрипторов Twitter содержат число, но я не могу понять.

Я пробовал это:

users = ["@jcunniet","@PaulLampon","@Aziliz31","@ssoumier","@marionsouzeau","@gaellombart","@bendarag" ...]

n = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]

puts " #{users.sum { |s| s.count(n.to_s) }} handle contain a number" 

Ответы [ 3 ]

0 голосов
/ 12 января 2019

Чтобы подсчитать, сколько элементов в массиве соответствует определенному условию, используйте Array#count с блоком, который проверяет условие:

users = ["@jcunniet", "@PaulLampon", "@Aziliz31", "@ssoumier", "@marionsouzeau", "@gaellombart", "@bendarag"]

users.count {|user| user =~ /[0-9]/ }
# => 1

Это предпочтительнее методов типа Array#grep, потому что он не инициализирует промежуточный массив.

Смотрите на repl.it: https://repl.it/@jrunning/ScentedDiscreteCables

0 голосов
/ 12 января 2019

Использовать цепочку простых методов

В Ruby вы можете использовать цепочку методов, чтобы иметь Enumerable # count , чтобы возвращать количество элементов, найденных Enumerable # grep . Например:

users.grep(/\d/).count
#=> 1

Конечно, есть и другие способы выполнить эту задачу, но этот код короткий, простой и легко читаемый. В этом случае методы цепочки также кажутся более логичными и идиоматичными, чем передача блока методу #count, но все зависит от семантики того, что вы действительно пытаетесь выразить в своем коде.

Включить поддержку Unicode

Менее симпатичный, но с поддержкой Unicode:

users.grep(/\p{Nd}/).count
#=> 1

Это не имеет значения для предоставленного вами примера, но это может иметь значение в реальном коде, особенно если ваши массивы построены динамически или содержат дезинфицированный ввод пользователя.

0 голосов
/ 12 января 2019

На самом деле существует очень простой способ отсканировать список и посмотреть, сколько строк содержит хотя бы одно число:

users = %w[ @jcunniet @PaulLampon @Aziliz31 @ssoumier @marionsouzeau @gaellombart @bendarag ]

users.grep(/\d/)
# => ["@Aziliz31"]

Теперь, если вы хотите узнать, сколько их, с точки зрения подсчета:

puts '%d handle contain a number' % users.grep(/\d/).length

То, что /\d/ является регулярным выражением . Они могут быть действительно сложными, но это означает «цифра». Регулярные выражения невероятно мощны, поэтому не пугайтесь их, потратив некоторое время на изучение того, как они работают, вы можете получить действительно компактные решения, подобные этому.

В вашем исходном коде есть многое, что, кажется, основано на ошибочных предположениях. Например, посмотрите, что делает n.to_s:

n= [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
n.to_s
# => "[1, 2, 3, 4, 5, 6, 7, 8, 9, 0]"

Это довольно уродливая строка, и count не сможет использовать ее, так как эта строка никогда не появится внутри дескриптора Twitter.

Аналогично, sum хочет сложить вещи, хотя здесь это не кажется необходимым, так как нечего добавить.

В Ruby есть много инструментов, которые могут вам помочь. Первая проблема заключается в сужении того, какие из них вы используете для соответствующих. Следующим шагом будет расширение ваших инструментов до более экзотических, таких как sum. Делайте это шаг за шагом, и все будет в порядке.

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