使用ruby查找txt文件中最老的人的姓名和年龄

时间:2016-05-22 20:56:29

标签: ruby

“附件是一个包含人名和年龄的文件。 将始终有一个名字和姓氏,然后是冒号,然后是年龄。 所以每一行都看起来像这样。 FirstName LastName:年龄

你的工作是写一个ruby程序,可以读取这个文件,并找出这个列表中最老的人/人。你的程序应该打印出他们的姓名和年龄。“

这是我到目前为止的代码:

File.open('nameage.txt') do |f|
  f.each_line do |line|
    line.split(":").last.to_i
    puts line.split(":").last.to_i
  end
end

有了这个,我可以将名字与年龄分开,但我不知道如何获得最高价值并打印出名称和年龄的最高值。 请帮忙!

6 个答案:

答案 0 :(得分:2)

“弄清楚这个列表中最老的人/人是谁”,因此可能有多个结果。 Ruby有一个group_by方法,它通过公共属性对可枚举进行分组。什么财产?您在块中指定的属性。

grouped = File.open('nameage.txt') do |f|
  f.group_by do |line|
    line.split(":").last.to_i  # using OP's line
  end
end

p grouped                      # just to see what it looks like    
puts grouped.max.last          # end result

答案 1 :(得分:1)

你可以把所有年龄都推到一个数组中。执行array.max或对数组进行排序并执行数组[-1]。

答案 2 :(得分:1)

以下是我如何处理它:

oldest_name = nil
oldest_age = 0
For each line in file do
  split line at the colon and store the age inside age variable
  split line at the colon and store the age inside name variable
  if age is greater than oldest_age then
    oldest_age = age
    oldest_name = name
  end
end

最后打印oldest_name和oldest_age

如果你在单行中试试这个

$ cat nameage.txt 
John Doe: 34
Tom Jones: 50
Jane Doe: 32
Citizen Kane: 29
$ irb
1.9.3-p551 :001 > IO.read("nameage.txt").split("\n").sort_by { |a| a.split(":")[1].to_i }.last
 => "Tom Jones: 50" 

答案 3 :(得分:1)

你也可以尝试使用哈希,

hash = {}
File.open('nameage.txt') do |f|
  f.each_line do |line|
    data = line.split(":")
    hash[data.first] = data.last.strip
  end
  hash.max_by{|k,v| v}.join(" : ")
end

答案 4 :(得分:1)

File.open('nameage.txt') do |handle|
  people = handle.each_line.map { |line| line.split(":") }
  oldest_age = people.map { |_, age| age.to_i }.max

  people.select { |_, age| age.to_i == oldest_age }.each do |name, age|
    puts "#{name}, #{age}"
  end
end

答案 5 :(得分:0)

你走对了路。现在你只需要将正确的东西存放在正确的位置。我刚刚合并了你的代码和 @ oystersauce14 提出的代码。

oldest_name = nil
oldest_age = 0
File.open('nameage.txt') do |f|
  f.each_line do |line|
    data = line.split(":")
    curr_name = data[0]
    curr_age = data[1].strip.to_i
    if (curr_age > oldest_age) then
      oldest_name = curr_name
      oldest_age = curr_age
    end
  end
end
puts "The oldest person is #{oldest_name} and he/she is #{oldest_age} years old."

注意在获取年龄时使用 String#strip 。根据文件的格式,这段数据(年龄)在第一个数字之前有一个空格,您需要在使用 String#to_i 转换它之前将其删除。

修改

由于您可能在列表中拥有多个年龄最大的人,您可以分两次通过:

oldest_age = 0
File.open('nameage.txt') do |f|
  f.each_line do |line|
    curr_age = line.split(":")[1].strip.to_i
    if (curr_age > oldest_age) then
      oldest_age = curr_age
    end
  end
end 
oldest_people = Array.new
File.open('nameage.txt') do |f|
  f.each_line do |line|
    data = line.split(":")
    curr_name = data[0]
    curr_age = data[1].strip.to_i
    oldest_people.push(curr_name) if (curr_age == oldest_age)
  end
end
oldest_people.each { |person| p "#{person} is #{oldest_age}" } 

我相信现在这将为您提供所需的一切。