我现在正在写一个Ruby应用程序,它将在twitter上搜索各种东西。我将要面对的问题之一是在时间上彼此接近的搜索之间共享结果。结果在一个对象数组中返回,每个对象都是一条tweet。我知道ruby中的Array.uniq方法,它返回一个去掉了所有重复项的数组。
我的问题是。如果这些对象指向内存中的相同空间,或者它们包含相同的信息,uniq方法是否会删除重复项?
如果是前者,那么根据其内容从数组中删除重复项的最佳方法是什么?
发布于 2009-10-30 23:36:06
如果这些对象指向内存中的相同空间,或者它们包含相同的信息,uniq方法是否会删除重复项?
该方法依赖于eql?方法,因此它删除了a.eql?(b)返回true的所有元素。确切的行为取决于您正在处理的特定对象。
例如,如果字符串包含相同的文本,则认为它们是相等的,而不管它们共享相同的内存分配。
a = b = "foo"
c = "foo"
[a, b, c].uniq
# => ["foo"]大部分核心对象都是这样的,但ruby对象不是这样。
class Foo
end
a = Foo.new
b = Foo.new
a.eql? b
# => falseRuby鼓励您根据您的类上下文重新定义==操作符。
在您的特定情况下,我建议创建一个表示twitter结果的对象,并实现您的比较逻辑,以便Array.uniq的行为符合您的预期。
class Result
attr_accessor :text, :notes
def initialize(text = nil, notes = nil)
self.text = text
self.notes = notes
end
def ==(other)
other.class == self.class &&
other.text == self.text
end
alias :eql? :==
end
a = Result.new("first")
b = Result.new("first")
c = Result.new("third")
[a, b, c].uniq
# => [a, c]发布于 2012-02-23 23:19:49
对于遇到这个问题的任何其他人来说,自从这个问题第一次被提出以来,事情似乎发生了一些变化,在较新的Ruby版本(至少是1.9.3)中,Array.uniq假设除了.eql?或==之外,您的对象还具有#hash方法的一个有意义的实现。
发布于 2009-10-30 23:31:31
uniq使用eql?,如this thread中所述。
有关==、equal?和eql?之间的区别,请参阅the official ruby documentation。
https://stackoverflow.com/questions/1650475
复制相似问题