只有非重复值的数组

时间:2014-03-13 12:19:44

标签: ruby arrays

这不是问题,但更多的问题是否有其他方法可以做到这一点:

我有一个数组:

arr = [1,2,3,4,4,5,1,4,3]

我想要这个输出:[2,5]

我的代码如下所示:

arr.select { |e| arr.count(e) == 1}

还有其他替代方案吗?

3 个答案:

答案 0 :(得分:8)

试试这个

arr.group_by { |e| e }.select { |k, v| v.size.eql? 1 }.keys
 => [2, 5] 

答案 1 :(得分:4)

您的代码将为每个元素扫描一次数组,这对于小型数组是可接受的,但它不是必需的。通过查看this blog post,很容易想出

arr = [1,2,3,4,4,5,1,4,3]
counts=Hash.new(0)

arr.each do |el|
  counts[el]+=1
end

counts.select do |key, count|
  count == 1
end.keys

会产生相同的结果,但只会遍历您的数组一次(但会牺牲两个额外的哈希值(如果您不需要select!,可以使用counts减少到一个: - )。

答案 2 :(得分:3)

首先需要查看整个数组以确定唯一性

def one(a)
  o = { }
  a.each do |x|
    v = o[x]
    if v == nil
      o[x] = true
    else
      if v
        o[x] = false
      end
    end
  end
  return o
end

然后使用它来选择唯一元素

def unique(a)
  o = one(a)
  b = [ ]
  o.each do |k, v|
    if v
      b.push(k)
    end
  end
  return b
end

测试代码

a = [ 1, 2, 3, 4, 4, 5, 1, 4, 3 ]
b = unique(a)
puts "unique: #{a} -> #{b}"

输出

unique: [1, 2, 3, 4, 4, 5, 1, 4, 3] -> [2, 5]

致力于Edsger W. Dijkstra

  

一个现代的,有能力的程序员不应该有困惑,他不应该陶醉于诡计,他应该谦虚并避免像瘟疫一样聪明的解决方案

(来自EWD303