我有一个由书籍/读者/日期组成的“订单”对象数组
我需要得到最高的读者(是一个占用最多的书籍)和数量返回的顶级读者必须是可配置的。默认数量为1读取器
这是16个订单的输出
[#<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为这个数组生成随机数据。
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
这里是主库类
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
编辑:
我现在是如何成为顶级读者/书籍的
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
以下是一个输出:
Mariel Beier is the top reader
Action Ninja is the top book
还不知道如何配置顶级读者/书籍的数量
发布于 2021-03-31 13:20:23
您可以使用group_by的组合为每个读者分组书籍,并使用sort_by对读取器进行排序。
orders_grouped = orders.group_by { |order| order.reader }
tab = orders_grouped.sort_by { |k,v| v.uniq.size }.reverse!
选项卡输出使用散列和三个一阶命令
[["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"}]]]
然后你就可以带着这样数量的读者
tab[0..quantity-1]
https://stackoverflow.com/questions/66886623
复制相似问题