Как удалить только 3 экземпляра одинаковых цифр в массиве, если в массиве более 3? - PullRequest
0 голосов
/ 30 июня 2011

Допустим, у меня есть массив, который содержит более трех повторений данной цифры.Я хочу удалить только три из этих повторений и оставить все оставшиеся экземпляры цифры в результирующем массиве.

Например:

a = [2, 2, 2, 1, 6]
b = a.map{|i|
    num = a.select{|v| v == i}.size
    num == 3 ? "" : i
    }.reject{|v|
        v == ""
    }

дает мне желаемый результат:

b == [1, 6]

Однако в приведенном ниже примере я хочу, чтобы последние 2 остались в массиве.

# I want to reject ONLY triplets.
# In the below example, the last "2" should remain
a = [2, 2, 2, 1, 2]
b = a.map{|i|
    num = a.select{|v| v == i}.size
    num == 3 ? "" : i
    }.reject{|v|
        v == ""
    }

Результат здесь:

b == [2, 2, 2, 1, 2]

Iхотелось бы, чтобы результат был:

b == [1, 2]

У меня также есть другой блок кода, аналогичный приведенному выше, с использованием немного другой логики, но в итоге получается тот же результат:

a = [2, 2, 2, 1, 2]
newdice = a.reject { |v|
    if a.count(v) == 3
        x = v
    end
    v == x
    }

Я в растерянности, если не считать какой-то неприятной хитрости, которая включает в себя нахождение индекса первого экземпляра 3х повторяющейся цифры и вырезаем из него [index, 2].Должен быть более "рубиновый" способ.

Спасибо!

Ответы [ 2 ]

1 голос
/ 30 июня 2011

Это удалит первые 3 элемента = 2

3.times{a.index(2)? a.delete_at(a.index(2)) : nil }

, если вы хотите удалить первые 3 любых цифры в массиве, тогда что-то вроде:

(0..9).each{|n| 3.times{a.index(n)? a.delete_at(a.index(n)) : nil }}

Версия Мэтта дополнительно модифицирована с использованием модификатора if:

(0..9).each{|n| {3.times{a.delete_at(a.index(n))} if a.count(n) >= 3}
0 голосов
/ 30 июня 2011

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

a = [2, 2, 2, 1, 2]
a.last(2) => [1,2]
a.uniq => [1,2]
...