首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在数组中找到最频繁的多个值

如何在数组中找到最频繁的多个值
EN

Stack Overflow用户
提问于 2021-03-31 11:07:29
回答 1查看 154关注 0票数 0

我有一个由书籍/读者/日期组成的“订单”对象数组

我需要得到最高的读者(是一个占用最多的书籍)和数量返回的顶级读者必须是可配置的。默认数量为1读取器

这是16个订单的输出

代码语言:javascript
运行
复制
 [#<Order:0x0000562626492558 @book="Codename: American Man", @reader="Mariel Beier", @date="30.03.2021">, 
    #<Order:0x00005626264924e0 @book="Forbidden Wizard", @reader="Mariel Beier", @date="30.03.2021">,
     #<Order:0x0000562626492468 @book="Action Ninja", @reader="Taryn Gutmann", @date="30.03.2021">,
     #<Order:0x00005626264923f0 @book="Action Ninja", @reader="Garret Lindgren", @date="30.03.2021">, 
    #<Order:0x0000562626492378 @book="Forbidden Wizard", @reader="Alysa Keeling", @date="30.03.2021">, 
    #<Order:0x0000562626492300 @book="War of the American Imp", @reader="Garrett Stroman", @date="30.03.2021">, 
    #<Order:0x0000562626492288 @book="Blue Witch", @reader="Garrett Stroman", @date="30.03.2021">, 
    #<Order:0x0000562626492210 @book="War of the American Imp", @reader="Sherlyn Schumm", @date="30.03.2021">, 
    #<Order:0x0000562626492198 @book="Action Ninja", @reader="Mac Funk", @date="30.03.2021">, 
    #<Order:0x0000562626492120 @book="Forbidden Wizard", @reader="Mariel Beier", @date="30.03.2021">, 
    #<Order:0x00005626264920a8 @book="The Nuclear Wolves", @reader="Les Conn", @date="30.03.2021">, 
    #<Order:0x0000562626492030 @book="War of the American Imp", @reader="Taryn Gutmann", @date="30.03.2021">, 
    #<Order:0x0000562626491fb8 @book="War of the American Imp", @reader="Les Conn", @date="30.03.2021">, 
    #<Order:0x0000562626491f40 @book="The Nuclear Wolves", @reader="Les Conn", @date="30.03.2021">, 
    #<Order:0x0000562626491ec8 @book="Action Ninja", @reader="Diamond Cole", @date="30.03.2021">, 
    #<Order:0x0000562626491e50 @book="Action Ninja", @reader="Garret Lindgren", @date="30.03.2021">]

基本上,我需要通过关键词(书籍/读者/最受欢迎的作者)来获得模式。

我使用ffaker为这个数组生成随机数据。

代码语言:javascript
运行
复制
  def build_author
    name = FFaker::Book.author
    biography = FFaker::Book.description
    Author.new(name, biography)
  end

  def build_book(author)
    title = FFaker::Book.title
    Book.new(title, author.name)
  end

  def build_reader
    name = FFaker::Name.name
    email = FFaker::Internet.email
    city = FFaker::Address.city
    street = FFaker::Address.street_name
    house = rand(1 - 10_000)
    Reader.new(name, email, city, street, house)
  end

  def build_order(book, reader)
    date = Time.now.utc.strftime('%d.%m.%Y')
    Order.new(book.title, reader.name, date)
  end

  def fill_author
    3.times do
      author = build_author
      @authors.push(author)
    end
  end

  def fill_book
    6.times do
      book = build_book(@authors.sample)
      @books.push(book)
    end
  end

  def fill_reader
    10.times do
      reader = build_reader
      @readers.push(reader)
    end
  end

  def fill_order
    16.times do
      @orders.push(build_order(@books.sample, @readers.sample))
    end
  end

这里是主库类

代码语言:javascript
运行
复制
class Library
  include DataBuilder
  include Statistics

  attr_accessor :authors, :books, :orders, :readers

  def initialize(authors: [], books: [], orders: [], readers: [])
    @books = books
    @orders = orders
    @readers = readers
    @authors = authors
  end

  def create_data
    create_arrays
    generate_data
  end

  def show
    create_data
    p top_reader
  end

编辑:

我现在是如何成为顶级读者/书籍的

代码语言:javascript
运行
复制
  def top_reader
    orders_grouped = orders.group_by(&:reader)
    tab = orders_grouped.max_by { |_k, v| v.count }.first
    puts "#{tab} is the top reader"
  end

  def top_book
    orders_grouped = orders.group_by(&:book)
    tab = orders_grouped.max_by { |_k, v| v.count }.first
    puts "#{tab} is the top book"
  end

以下是一个输出:

代码语言:javascript
运行
复制
Mariel Beier is the top reader
Action Ninja is the top book

还不知道如何配置顶级读者/书籍的数量

EN

回答 1

Stack Overflow用户

发布于 2021-03-31 13:20:23

您可以使用group_by的组合为每个读者分组书籍,并使用sort_by对读取器进行排序。

代码语言:javascript
运行
复制
  orders_grouped = orders.group_by { |order| order.reader }
  tab = orders_grouped.sort_by { |k,v| v.uniq.size }.reverse!

选项卡输出使用散列和三个一阶命令

代码语言:javascript
运行
复制
[["Mariel Beier", [{:book=>"Codename: American Man", :reader=>"Mariel Beier", :date=>"30.03.2021"}, {:book=>"Forbidden Wizard", :reader=>"Mariel Beier", :date=>"30.03.2021"}]],
 ["Taryn Gutmann", [{:book=>"Action Ninja", :reader=>"Taryn Gutmann", :date=>"30.03.2021"}]]]

然后你就可以带着这样数量的读者

代码语言:javascript
运行
复制
tab[0..quantity-1]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66886623

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档