0

假设我有一个数组,其中包含三个以上给定数字的重复。我只想删除其中三个重复,并将数字的任何剩余实例留在结果数组中。

例如:

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]

我希望结果是:

b == [1, 2]

我还有另一个代码块,类似于上面的代码块,使用有点不同的逻辑,但最终得到相同的结果:

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

我不知所措,除了一些令人讨厌的诡计,包括找到 3x 重复数字的第一个实例的索引,并从中切出 [index, 2] 。必须有一种更“类似红宝石”的方式。

谢谢!

4

2 回答 2

1

这将删除前 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 }}

Matt 的版本使用if-modifier 进一步修改:

(0..9).each{|n| {3.times{a.delete_at(a.index(n))} if a.count(n) >= 3}
于 2011-06-30T11:53:49.303 回答
0

不确定您希望如何显示项目,但如果您想使用以下是简单的选项

a = [2, 2, 2, 1, 2]
a.last(2) => [1,2]
a.uniq => [1,2]
于 2011-06-30T11:59:47.920 回答