我有两个类的程序:PhoneBook和PhoneContact。该计划的目标是使用电话号码和电话号码类型(称为标签)。 PhoneContact类接受名称并将其存储为联系人。所以,它的工作原理如下:
Bary_Bonds = PhoneContact.new(:work,'(111) 111-111', 'Barry Bonds')
PhoneBook类接收电话联系并将其存储在目录中。它可以添加,删除,查找和显示电话簿中的所有联系人。我想制作一个按字母顺序显示所有联系人的方法。
这是我的电话簿类代码:
class PhoneBook
attr_accessor :contact_list
def initialize
@contact_list = []
end
这是我的组织方法:
def organize
puts @contact_list.each.map { |e| Array(e).join(", ") }.sort
end
我不知道该怎么做。我知道我的组织方法代码只输出数字而不输出联系人的姓名。因此,上面的代码返回此输出:
(111) 111-1111
(222) 222-5222
(555) 555-5555
答案 0 :(得分:0)
您需要按名称对其进行排序,而不是盲目排序 首先,您需要在其名称属性上为PhoneContact类设置属性访问器。 像这样:
class PhoneContact
attr_accessor: name
def initialize(label, phone_number, name)
@name =name
end
一旦你有了这个,就这样做:
def organize
puts @contact_list.sort { |a,b| a.name <=> b.name}
end
或者如果您希望它只输出名称,请执行以下操作:
def organize
puts @contact_list.sort { |a,b| a.name <=> b.name}.map do |x|
x.name
end
end
答案 1 :(得分:0)
正如borbesaur所提到的,您需要按PhoneContact对象上的name属性进行排序。要自定义输出,您需要在PhoneContact上实现to_s
方法:
class PhoneContact < Struct.new(:type, :number, :name)
def to_s
"#{name}, #{type}: #{number}"
end
end
您可以使用方法sort_by
作为快捷方式,按属性对对象数组进行排序:
def organize
puts @contact_list.sort_by(&:name)
end
这应该会产生如下输出:
Barry Bonds, work: (555) 555-5555
Bobby Bonilla, work: (222) 222-5222
Doug Drabek, work: (111) 111-1111