Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Ruby数组中删除重复项(按键)的最快/一行方法?_Ruby_Arrays_Duplicates - Fatal编程技术网

在Ruby数组中删除重复项(按键)的最快/一行方法?

在Ruby数组中删除重复项(按键)的最快/一行方法?,ruby,arrays,duplicates,Ruby,Arrays,Duplicates,基于特定的key:value或方法返回的结果,删除对象数组中的重复项的最快/最简单的方法是什么 例如,我有20个名称相同的XML元素节点,但它们有不同的“文本”值,其中一些是重复的。我想通过说“if element.text==previous_element.text,remove it”来删除重复项。如何在Ruby中以最短的代码量做到这一点 我已经了解了如何对简单的字符串/整数值执行此操作,但对对象不执行此操作。以下是标准的哈希方法。请注意使用| |=运算符,这是一种更方便的(a | |=b

基于特定的key:value或方法返回的结果,删除对象数组中的重复项的最快/最简单的方法是什么

例如,我有20个名称相同的XML元素节点,但它们有不同的“文本”值,其中一些是重复的。我想通过说“if element.text==previous_element.text,remove it”来删除重复项。如何在Ruby中以最短的代码量做到这一点


我已经了解了如何对简单的字符串/整数值执行此操作,但对对象不执行此操作。

以下是标准的哈希方法。请注意使用
| |=
运算符,这是一种更方便的(
a | |=b
)写入
a=b的方法,除非a

array.inject({}) do |hash,item|
   hash[item.text]||=item
   hash 
end.values.inspect
你也可以在一行中完成

脚本需要对
text
字符串进行O(n)相等性检查。当你看到一个散列时,这就是O(n)中所包含的内容。

这就完成了:

Hash[*a.map{|x| [x.text, x]}].values
短?是的。

(星号是可选的;1.8.6中似乎需要星号)

例如:

a = [Thing.new('a'), Thing.new('b'), Thing.new('c'), Thing.new('c')]
=> [#<Thing a>, #<Thing b>, #<Thing c>, #<Thing c>]

Hash[a.map{|x| [x.text, x]}].values
=> [#<Thing a>, #<Thing b>, #<Thing c>]
a=[Thing.new('a')、Thing.new('b')、Thing.new('c')、Thing.new('c')]
=> [#, #, #, #]
散列[a.map{| x |[x.text,x]}]。值
=> [#, #, #]
无聊的部分:这是我使用的一个小测试类:

class Thing
  attr_reader :text
  def initialize(text)
    @text = text
  end

  def inspect
    "#<Thing #{text}>"
  end
end
类的东西
属性读取器:文本
def初始化(文本)
@文本=文本
结束
def检查
"#"
结束
结束
与块一起使用。就你而言:

array.uniq(&:text) # => array with duplicated `text` removed

这是在Ruby 1.9.2中引入的,因此如果使用早期版本,可以与
require'backports/1.9.2/array/uniq'

一起使用,因为它的运行时间为O(n^2)。再说一次,考虑到现在的CPU时间有多便宜,这并不重要。@EmFi,访问哈希表不需要O(n)(我们应该迭代字符串
文本
,但无论如何我们都必须这样做)。我刚刚发布了一个关于此事的答案:@Pavel对不起,你说得对。我一时糊涂,以为增值调用使它变成了O(n^2)。当它只是O(2n)。这个答案是有效的,但过时了,请看我的答案。它在新的,甚至更短,更简单的版本中消失了:)。但是,说
ary.map{x | x.last}
ary.map(&:last)
是等价的。我有以下错误:“[]”中:散列(ArgumentError)的参数数为奇数,是吗?你对a.map{| x |[x.text,x]}的输出是什么?我仔细检查了一下,看起来还可以…运行ruby 1.8.6;没有重写
inspect
方法;以下是输出:。它恰好是一个数组,一个是奇数整数。我想他们把1.8.6改成了1.8.7。我没有访问1.8.6的权限,但我相信您可以执行
散列[*a.map{{x |[x.text,x]}]。值
。请参阅我的答案了解现代用法。