1

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

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

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

4

4 回答 4

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
于 2012-04-20T06:57:08.393 回答
4

它被称为多集。这是Ruby 实现

于 2012-04-20T07:04:58.657 回答
0

单线:

Hash[a.zip(a.map{|x| a.count(x)})] == Hash[e.zip(e.map{|x| e.count(x)})]
于 2013-09-17T13:18:53.843 回答
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。

于 2014-06-06T23:49:12.660 回答