【问题标题】:How would I group the "0 comparison value" of a ruby array after sorting them?在对 ruby​​ 数组进行排序后,我将如何对它们进行分组?
【发布时间】:2017-06-13 13:36:12
【问题描述】:

我有一个包含评分、胜负和胜负百分比的玩家列表。我使用 sort_by 按评分排序,然后按输赢百分比,最后按获胜次数。但是,我还需要将排名相同的那些组合在一起。根据 ruby​​ sort_by 文档here,排序块计算-1,0,+1。我需要根据排序算法对0 的结果进行分组。

然后我想将它们作为哈希返回,其中排名作为一个键,玩家作为另一个键。我将如何开始实现这一目标?

谢谢!

这是我目前拥有的代码,但我只是不知道如何将它们组合在一起。

# User.rb
def self.all_rankings
  sorted_rankings = self.searchable.sort_by do |user|
    [-user.rating, -user.all_wins_losses_as_decimal, -user.all_wins]
  end
  rank = 1
  sorted_rankings.map.with_index(1) do |user, index|
    {
      "rank": index,
      "user": user
    }
  end
end

编辑:这是所需 API 输出的示例。但是,我想将用户的等级分组在一起。因此,例如,我按照ratingall_wins_losses_as_decimalall_wins 的顺序进行排序。如果两个用户具有相同的ratingall_wins_losses_as_decimalall_wins,那么这两个用户应该具有相同的排名。

"users": [
    {
      "id": 560,
      "name": "Aaron Rodgers",
      "rank": 1,
      "z_rating": 40,
      "all_wins": 2,
      "all_losses": 0,
      "all_wins_losses_percentage": "1.000"
    },
    {
      "id": 559,
      "name": "Director Sports",
      "rank": 2,
      "z_rating": 40,
      "all_wins": 1,
      "all_losses": 0,
      "all_wins_losses_percentage": "1.000"
    },
    {
      "id": 571,
      "name": "Alford Schamberger",
      "rank": 3,
      "z_rating": 40,
      "all_wins": 1,
      "all_losses": 1,
      "all_wins_losses_percentage": ".500"
    }
]

我正在考虑通过创建用户等级和用户对象的哈希来返回 z_ratingall_winsall_lossesall_wins_losses_percentage

ratingUser 模型的一个属性。 all_wins_losses_as_decimalUser 类上的一个方法,它返回 Float 类型。 all_winsUser 类的另一种方法,它返回 Int

【问题讨论】:

  • 您想要的结果是什么样的?请编辑您的问题以包含一些示例输入和输出。
  • 提示:当你说“我需要分组”时,你可能是指group_by。这个问题很难用带有样本数据和预期结果的最小用例来回答。
  • 嘿,很抱歉造成混乱。我已经添加了更多信息来解决问题。如果您需要更多信息,请与我们联系。谢谢!

标签: arrays ruby sorting hash grouping


【解决方案1】:

不是专家,也不确定这是否可行,但您现在可以简单地Hash.select 说一下

h1.select { |key, value| value == '0' }
h1.select { |key, value| value == '1' }

等等,你可以将值 0 -1 1 设置为你想要的任何值?

【讨论】:

  • 嘿,感谢您的回答,但我没有您在此处提供的 value。如果我可以从 ruby​​ 排序返回值 -1、0 或 +1,那么我将能够对它们进行分组,但我不知道如何从 ruby​​ 排序中得到它。
【解决方案2】:

0 的结果是与<=> 比较的结果,因此您始终可以编写类似的解决方案

# User.rb
def self.all_rankings
  sorted_rankings = self.searchable.sort_by do |user|
    [-user.rating, -user.all_wins_losses_as_decimal, -user.all_wins]
  end
  rank = 1
  rankings = Hash.new []
  selected_rating = sorted_rankings[0]
  sorted_rankings.each do |user|
     if selected_rating <=> user != 0
       selected_rating = user
       rank += 1
     end
     rankings[rank] << ranking
  end
  return rankings
end

实际上,您的输出将是一个带有哈希值的哈希值,其中排名作为键,用户数组作为值。有效地将所有同等级别的用户分组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-02
    • 1970-01-01
    相关资源
    最近更新 更多