我有一个articles
数组,其每个元素都有source
和score
个属性。我可以选择每个最高分的文章[原文如此],如:
articles = articles.sort_by(&:score).reverse.uniq(&:source)
如果我想通过source
获取前三个唯一元素该怎么办? uniq
只能返回第一个。
以下是所需的示例,您可以指定uniq(first_n_element)
来获取n个元素:
# To make the example simpler,
# I use array as element
b = [["source1","10"], ["source2","9"], ["source3","8"], ["source1","7"], ["source1","9"], ["source2","8"]]
# return should contain ["source1","10"], ["source1","9"],
# because they are the first 2 distinct element by `source`,
b.sort(&:second).uniq(2) { |s| s.first }
# => [["source1","10"], ["source2","9"], ["source3","8"], ["source1","9"], ["source2","8"]]
答案 0 :(得分:2)
不确定,但以下可能是您想要的。我假设元素的顺序是无关紧要的。
articles = articles
.group_by(&:source)
.values
.flat_map{|a| a.sort_by(&:score).last(2)}
如果订单很重要,请使用上述结果执行articles &
。
答案 1 :(得分:1)
如果您想获得表现出最高分数的前三个独特来源,您可以执行以下操作(如果您还想要其他内容,那么就不能完全理解您的问题而道歉。)
首先,确保分数是整数,而不是字符串:
b = [["source1",10], ["source2",9], ["source3",8], ["source1",7], ["source1",9], ["source2",8]]
然后这样做:
b.sort_by(&:second).reverse!.uniq(&:first).first(3)
(使用#reverse!
获得最快的结果,每this)
答案 2 :(得分:0)
您的示例数组Couldn't find project [dependency] in reactor; make sure you specified the correct group:artifactId
是一个数组数组 - 其中没有包含名为b
或score
的方法的对象。鉴于这些限制,以下是最接近可以得出答案的人。另外,为了使排序正常工作,第二个元素应该是整数,所以我们需要通过在source
方法中调用to_i
将第二个元素转换为整数
map
<强>输出强>
class Array
def second
self[1]
end
end
articles = [["source1","10"], ["source2","9"],
["source3","8"], ["source1","7"],
["source1","9"], ["source2","8"],
["source1", "100"]]
p articles.map{|a| [a.first, a.second.to_i]}
.sort_by(&:second).reverse.uniq(&:first)
# To get first n elements, add first(n)
p articles.map{|a| [a.first, a.second.to_i]}
.sort_by(&:second).reverse.uniq(&:first).first(2)