Ruby 中有没有代表无序数组的类?我不能使用数组,因为:
[1,2] != [2,1]
而且我不能使用集合,因为我只能拥有独特的元素。我想要一种两种组合。一个不关心排序并且可以有多个相同元素的列表。
Ruby 中有没有代表无序数组的类?我不能使用数组,因为:
[1,2] != [2,1]
而且我不能使用集合,因为我只能拥有独特的元素。我想要一种两种组合。一个不关心排序并且可以有多个相同元素的列表。
我猜你已经扩展了 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
它被称为多集。这是Ruby 实现。
单线:
Hash[a.zip(a.map{|x| a.count(x)})] == Hash[e.zip(e.map{|x| e.count(x)})]
这是一个稍微干净的 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。