【问题标题】:Convert Ruby Hash to ranks with no repeats将 Ruby Hash 转换为无重复的排名
【发布时间】:2020-03-09 10:09:36
【问题描述】:
[{:listing_id=>1, :vote_size=>1, :created_at=>Wed, 13 Nov 2019 02:19:45 UTC +00:00},
 {:listing_id=>2, :vote_size=>0, :created_at=>Thu, 14 Nov 2019 02:19:45 UTC +00:00},
 {:listing_id=>3, :vote_size=>0, :created_at=>Fri, 15 Nov 2019 02:19:45 UTC +00:00}]

我有以下列表 ID 的哈希值、投票数和 Ruby 中所述列表的 created_at 日期(更高的 vote_size 更好),我想对它们进行排名。换句话说,我想从某种函数中获取排名,然后通过 Listing.update_attribute(:rank, function-call) 或类似的东西更新列表中的排名。等级1是最好的。如果存在具有相同票数的列表,则只有其中一个应该获得排名,而另一个列表应该获得低于的排名。 (假设决胜局是listing created_at 日期,首先创建listing 的人排名更高。)

这就是我到目前为止所拥有的,而且我被困住了哈哈,真的需要一些帮助。

namespace :server do
  desc "update the listings rank"
  task update_listing_rank: :environment do
      listings = Listing.all
      all_listings_with_votes = total_votes_for_listing listings


      all_listings_with_votes.map{ |e|
          puts all_listings_with_votes.index(e) + 1
        }

  end

  def total_votes_for_listing listings
    listings.map do |listing|
      {listing_id: listing.id, vote_size: listing.votes.size, created_at: listing.created_at}
    end
  end


end

【问题讨论】:

    标签: ruby-on-rails ruby algorithm sorting hashmap


    【解决方案1】:

    这里有一个很大的提示......拿你的数组和

    arr.sort{|x,y| x[:vote_size] <=> y[:vote_size]}
    

    这将为您提供投票大小的排序数组。

    【讨论】:

      【解决方案2】:

      你可以试试这个,这意味着我们按组合 vote_size 和 created_at 排序,vote_size 降序和 created_at 升序,以防vote_size 有两个相等的值

      an_array.sort_by {|a| [-a[:vote_size] , a[:created_at]] }
      

      【讨论】:

      • ...如果arr 是此表达式返回的数组,则arr[i] 的排名为i+1
      猜你喜欢
      • 2013-12-27
      • 2011-06-16
      • 2012-04-08
      • 2017-02-24
      • 2018-06-21
      • 1970-01-01
      • 2010-09-16
      • 2013-01-28
      • 1970-01-01
      相关资源
      最近更新 更多