我的电话簿程序没有正确排序我的联系人列表(红宝石)?

时间:2016-11-07 23:21:36

标签: ruby

我有两个类的程序: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

2 个答案:

答案 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