数组的前n个元素(按属性)

时间:2015-08-02 09:15:31

标签: ruby

我有一个articles数组,其每个元素都有sourcescore个属性。我可以选择每个最高分的文章[原文如此],如:

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"]]

3 个答案:

答案 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是一个数组数组 - 其中没有包含名为bscore的方法的对象。鉴于这些限制,以下是最接近可以得出答案的人。另外,为了使排序正常工作,第二个元素应该是整数,所以我们需要通过在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)