比较包含重复的数组元素

时间:2017-02-02 17:20:03

标签: arrays ruby duplicates comparison

我试图查看数组是否包含另一个数组的每个元素。另外,我想说明重复项。例如:

dialogClass.getEditTextValue()

数组包含[1,2,3,3]但不包含[2,2,“abc”] - 太多2的

我已经尝试了以下但显然没有考虑到欺骗。

array = [1, 2, 3, 3, "abc", "de", "f"]

2 个答案:

答案 0 :(得分:3)

此方法在两个数组上迭代一次。 对于每个数组,它会创建一个散列,其中包含每个元素的出现次数。

然后检查subset中的每个唯一元素,superset中的元素数量至少为。{/ p>

class Array
  def count_by
    each_with_object(Hash.new(0)) { |e, h| h[e] += 1 }
  end

  def subset_of?(superset)
    superset_counts = superset.count_by
    count_by.all? { |k, count| superset_counts[k] >= count }
  end
end

[1, 2, 3, 3, "abc", "de", "f"].count_by
#=> {1=>1, 2=>1, 3=>2, "abc"=>1, "de"=>1, "f"=>1}

[1, 2, 3, 3].count_by
#=> {1=>1, 2=>1, 3=>2}

[1, 2, 3, 3].subset_of? [1, 2, 3, 3, "abc", "de", "f"]
#=> true
[2, 2, "abc"].subset_of? [1, 2, 3, 3, "abc", "de", "f"]
#=> false

如果您不想修补Array课程,可以定义:

count_by(array)subset_of?(array1, array2)

答案 1 :(得分:0)

您可以先为类Array创建一个有用的实例方法:

class Array
  def difference(other)
    h = other.each_with_object(Hash.new(0)) { |e,h| h[e] += 1 }
    reject { |e| h[e] > 0 && h[e] -= 1 }
  end
end

如果以下方法返回a,则数组b中的所有元素都包含在数组true中。

def subarray?(a,b)
  a.difference(b).empty?
end

例如,

subarray? [1,2,3], [1,4,"cat",3,2]
  #=> true
subarray? [1,2,3], [1,4,"cat",3,5]
  #=> false

我发现Array#difference具有如此广泛的应用程序,我proposed将它添加到Ruby核心。有关方法及其用途的详细信息,请参阅链接以及我对this SO问题的回答。