gpt4 book ai didi

ruby - 如何选择独特的元素

转载 作者:数据小太阳 更新时间:2023-10-29 06:48:55 26 4
gpt4 key购买 nike

我想用 uniq_elements 方法扩展 Array 类,该方法返回那些重数为 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]

闭包示例:

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]

t-t.uniqt.to_set-t.uniq.to_set 都不起作用。我不关心速度,我在我的程序中只调用一次,所以它可能很慢。

最佳答案

辅助方法

此方法使用助手:

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

这个方法类似于 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]

如您所见,a 包含三个 3,b 包含两个,所以 first 两个 3 在 a 在构造 c 时被移除(a 未发生变化)。当 b 包含与 a 一样多的元素实例时,c 不包含该元素的实例。删除从 a 末尾开始的元素:

a.reverse.difference(b).reverse #=> [3, 1, 2, 2]

Array#difference! 可以用显而易见的方式定义。

我发现此方法有很多用途:herehereherehereherehereherehereherehereherehereherehereherehereherehereherehereherehere hereproposed 、 ojit_a 和 ojit_a 。

我有 ojit_a 将此方法添加到 Ruby 核心。

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

a = [1,3,2,4,3,4]
u = a.uniq #=> [1, 2, 3, 4]
u - a.difference(u) #=> [1, 2]

这是可行的,因为

a.difference(u)     #=> [3,4]    

包含 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

例子

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]

关于ruby - 如何选择独特的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24987054/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com