如何选择独特的元素

Kon*_*tin 9 ruby arrays uniq

我想Array用一个uniq_elements方法来扩展该类,该方法返回多个为1的元素.我也想在我的新方法中使用闭包uniq.例如:

t=[1,2,2,3,4,4,5,6,7,7,8,9,9,9]
t.uniq_elements # => [1,3,5,6,8]
Run Code Online (Sandbox Code Playgroud)

关闭示例:

t=[1.0, 1.1, 2.0, 3.0, 3.4, 4.0, 4.2, 5.1, 5.7, 6.1, 6.2]
t.uniq_elements{|z| z.round} # => [2.0, 5.1]
Run Code Online (Sandbox Code Playgroud)

既不工作t-t.uniq也不t.to_set-t.uniq.to_set工作.我不关心速度,我在程序中只调用一次,所以它可能很慢.

Car*_*and 11

辅助方法

此方法使用帮助程序:

class Array
  def difference(other)
    h = other.each_with_object(Hash.new(0)) { |e,h| h[e] += 1 }
    reject { |e| h[e] > 0 && h[e] -= 1 }
  end
end
Run Code Online (Sandbox Code Playgroud)

此方法类似于Array# -.以下示例说明了这种差异:

a = [3,1,2,3,4,3,2,2,4]
b = [2,3,4,4,3,4]

a - b              #=> [1]
c = a.difference b #=> [1, 3, 2, 2] 
Run Code Online (Sandbox Code Playgroud)

如你所见,a包含三个3并且b包含两个,所以两个3' a在构造中被删除c(a未变异).当b含有至少与许多一样的元素的情况下a,c不包含该元素的实例.要从以下结尾处删除元素a:

a.reverse.difference(b).reverse #=> [3, 1, 2, 2]
Run Code Online (Sandbox Code Playgroud)

Array#difference! 可以用明显的方式定义.

我发现这种方法有很多用途:这里,这里,这里,这里,这里,这里,这里,这里,这里,这里,这里,这里,这里,这里,这里,这里,这里,这里,这里,这里,这里,这里这里.

我已经建议将此方法添加到Ruby核心中.

Array#-此一起使用时,此方法可以轻松地从数组中提取唯一元素a:

a = [1,3,2,4,3,4]
u = a.uniq          #=> [1, 2, 3, 4]
u - a.difference(u) #=> [1, 2]
Run Code Online (Sandbox Code Playgroud)

这是因为

a.difference(u)     #=> [3,4]    
Run Code Online (Sandbox Code Playgroud)

包含所有非唯一元素a(每个可能不止一次).

手头的问题

class Array
  def uniq_elements(&prc)
    prc ||= ->(e) { e }
    a = map { |e| prc[e] }
    u = a.uniq
    uniques = u - a.difference(u)
    select { |e| uniques.include?(prc[e]) ? (uniques.delete(e); true) : false }
  end
end
Run Code Online (Sandbox Code Playgroud)

例子

t = [1,2,2,3,4,4,5,6,7,7,8,9,9,9]
t.uniq_elements
  #=> [1,3,5,6,8]

t = [1.0, 1.1, 2.0, 3.0, 3.4, 4.0, 4.2, 5.1, 5.7, 6.1, 6.2]
t.uniq_elements { |z| z.round }
  # => [2.0, 5.1]
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

1421 次

最近记录:

8 年,9 月 前