Есть ли способ получить скобки из вывода кода? Я хотел бы распечатать код в удобном для пользователя виде - PullRequest
1 голос
/ 03 апреля 2019

Мне удалось выяснить, как получить индексы, которые содержат максимальное значение в массиве.

Пример:

b = [2, 3, 4, 4]
c = [2, 3, 4, 4].max
a=b.each_index.select{|i| b[i]== c}
puts a

=> [2, 3]

Я не хочу получать [2, 3]; Я хочу избавиться от скобок. Кроме того, я хочу добавить 1 к индексам, чтобы получить: 3, 4. Я не хочу начинать отсчет с 0.

В идеале вывод будет выглядеть так:

=> 3, 4

Ответы [ 2 ]

3 голосов
/ 03 апреля 2019

Самый простой способ получить желаемый результат - использовать Array # join метод

т.е.

puts [2, 3].join(', ')
# => 2, 3

Если затем вам нужен порядковый номер для каждого совпадения вместо индекса, проще всего будет просто сопоставить их с индексом + 1

[2, 3].map{ |i| i + 1 }
# => [3, 4]

В целом ваше назначение и оператор puts могут быть записаны как

a = b.each_index.select{ |i| b[i] == c }.map{ |i| i + 1 }.join(', ')
puts a

=> 3, 4
2 голосов
/ 03 апреля 2019

Использование Array#map, Enumerator#with_index, Array#select, Array#first, Array#max, Array#last и Array#join

b = [2, 3, 4, 4]

b.map.with_index(1).select { |a| a.first == b.max }.map(&:last).join(", ") # => "3, 4"
# Step 1
b.map.with_index(1).to_a # => [[2, 1], [3, 2], [4, 3], [4, 4]]

# Step 2
b.map.with_index(1).select { |a| a.first == b.max } # => [[4, 3], [4, 4]]

# Step 3
b.map.with_index(1).select { |a| a.first == b.max }.map(&:last) # => [3, 4]

# Step 4
b.map.with_index(1).select { |a| a.first == b.max }.map(&:last).join(", ") # => "3, 4"

Вы можете использовать его как свой собственный метод

def max_elements_ids(ary)
  ary.
    map.
    with_index(1).
    select { |a| a.first == b.max }.
    map(&:last).
    join(", ")
end

puts max_elements_ids([2, 3, 4, 4]) # will print 3, 4
puts max_elements_ids([2, 4, 3, 4, 4]) # will print 2, 4, 5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...