是否有一个类代表Ruby中的无序数组?我不能使用数组,因为:
[1,2] != [2,1]
我不能使用set因为我只能拥有独特的元素。我想要一种两种组合。一个不关心排序的列表,可以有多个相同的元素。
答案 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。