Arrays 从具有多个匹配对象的阵列中删除一个对象

Arrays 从具有多个匹配对象的阵列中删除一个对象,arrays,ruby,Arrays,Ruby,我有一个数组: array = ['a', 'b', 'c', 'a', 'b', 'a', 'a'] 排序,只是为了便于查看: array = ['a', 'a', 'a', 'a', 'b', 'b', 'c'] 例如,我想删除三个a数组。删除('a')删除每个a 下面的代码“有效”,但我想你会同意它绝对可怕 new_array = array.sort.join.sub!('aaa', '').split(//) 我该如何更干净地做这件事 为了提供更多关于我在这里所做工作的信息,我

我有一个数组:

array = ['a', 'b', 'c', 'a', 'b', 'a', 'a']
排序,只是为了便于查看:

array = ['a', 'a', 'a', 'a', 'b', 'b', 'c']
例如,我想删除三个
a
<代码>数组。删除('a')删除每个
a

下面的代码“有效”,但我想你会同意它绝对可怕

 new_array = array.sort.join.sub!('aaa', '').split(//)
我该如何更干净地做这件事

为了提供更多关于我在这里所做工作的信息,我将一些字符串异步推送到数组中。这些字符串可以(并且经常)彼此相同。如果有一定数量的匹配字符串,则会触发一个动作,删除匹配的对象(我想是俄罗斯方块),并继续该过程

在运行以下代码之前,
数组
可以是
['a','a','b']

while array.count(product[:name]) >= product[:quantity]
  # trigger an event
  product[:quantity].times do
    array.slice!(array.index(product[:name]))
  end
end

假设
product[:name]
a
product[:quantity]
3
,在上面的代码运行之后,数组应该是
['b']
slice
可能是您正在寻找的东西:

3.times {array.slice!(array.index('a'))}

如果要维护或转换数组,使其仅包含每个元素的一个实例,可以使用
uniq
或集合而不是数组

array = ['a', 'b', 'c', 'a', 'b', 'a', 'a']
array.uniq # => ["a", "b", "c"]

require 'set'
array.to_set # => #<Set: {"a", "b", "c"}>
从这一点上,很容易找出哪些超过了某个计数:

array_count.select{ |k, v| v >= 3 } # => {"a"=>4}
要快速从数组中删除某个元素,请在处理后使用set“”操作:

array = ['a', 'a', 'a', 'a', 'b', 'b', 'c']
array -= ['a']
# => ["b", "b", "c", "c"]
删除\u,如果

array.delete_if { |i| i == 'a' }
array # => ["b", "b", "c"]

我想你有XY问题。应该使用出现次数作为值的散列,而不是数组

hash = Hash.new(0)
要添加实体时,应执行以下操作:

hash["a"] += 1
如果要将数字限制为某个值,例如k,则执行以下操作:

hash["a"] += 1 unless hash["a"] == k

3.times{a | a.shift}
/如果您只想为每个值保留一个条目,您可以使用
uniq
(或
uniq!
)在触发代码之前给我们一个数组示例,以及在触发代码之后它应该是什么样子。(换句话说,输入数据和输出数据。)@theTinMan添加now@sawa提到这看起来像一个“”,我同意。问题的根源是使用数组而不是哈希作为基本容器。当您要按顺序处理队列或列表时,数组是好的,但当您需要跟踪事物的计数时,数组是糟糕的,因为您必须遍历该数组才能找到您拥有的特定事物的数量。当您将数组作为源时,有多种方法可以强制从数组中获取所需的信息。你创建数组了吗?所以你要找到一个给定对象的索引,然后切片该对象,并重复它需要被删除多少次。好办法!您应该记得检查您的项是否存在,否则在尝试将nil转换为slice的索引时会出现类型错误:
3.times{arr.slice!(arr.index('a'))如果arr.include?}
,在这种情况下,我需要多个匹配的对象,这样uniq就不能工作了。@dax你是说你只希望它应用于“a”而不一定应用于“b”?@MarkThomas,不-我会编辑原始帖子,这样你就可以更准确地看到我在做什么。在第一遍提供一个完整而彻底的示例非常重要。不这样做会导致大量的工作浪费,并且需要更长的时间才能得到一个可用的答案。@theTinMan,对此很抱歉-我一直在努力在详细和不太复杂的散列或集合之间取得良好的平衡。集合就是为这个问题设计的。请原谅,我对Ruby的集合不是很熟悉。是否有某种方法可以提取集合中特定项的实例数?我假设一个集合会考虑每个条目有1的计数,而看起来维护多个实例或对@ DAX问题的实例计数是目标的一部分。据我所知,一个集合不会提供这种功能。一个集合只包含唯一的项。不可能有重复的密钥,就像在散列中不可能有重复的密钥一样。散列适合于保留计数。@sawa,我同意这是一个XY问题,我认为将计数作为基本对象使用散列是最好的起点。充实这一点,展示当超过计数时如何触发,您将获得一个赢家。感谢sawa-这在将我得到的数组映射到散列中增加了一个额外步骤,但它确实使迭代更干净、更有意义。
hash["a"] += 1 unless hash["a"] == k