Ruby中的无序数组

时间:2012-04-20 06:29:24

标签: ruby

是否有一个类代表Ruby中的无序数组?我不能使用数组,因为:

[1,2] != [2,1]

我不能使用set因为我只能拥有独特的元素。我想要一种两种组合。一个不关心排序的列表,可以有多个相同的元素。

4 个答案:

答案 0 :(得分:4)

我猜你已经扩展了Array类并编写了自己的==方法。这是我的实验尝试:

class UnorderedArray < Array
  def ==(other)
    self_copy = self.sort
    other = other.sort
    self_copy == other
  end
end

a = UnorderedArray.new
a << 1 << 2
# [1, 2]

b = UnorderedArray.new
b << 2 << 1
# [2, 1]

a == b
# returns true

答案 1 :(得分:4)

它被称为multiset。这是Ruby implementation

答案 2 :(得分:0)

一衬垫:

Hash[a.zip(a.map{|x| a.count(x)})] == Hash[e.zip(e.map{|x| e.count(x)})]

答案 3 :(得分:0)

这是一个稍微干净一点的mixin,可以处理不可排序的数组并缓存哈希值,因为它是O(n)。

class UnorderedArray < Array
  def hash
    unless @o && @o == super.hash
      p = Hash.new(0)
      each{ |v| p[v] += 1 }
      @p = p.hash
      @o = super.hash
    end
    @p.hash
  end
  def <=>(b)
    raise "You can't order me"
  end
  def ==(b)
    hash == b.hash
  end
end

但是除非数组的顺序相同,否则#eql?将返回false。