使用它包含的字符串的数值对数组进行排序

时间:2014-12-04 14:02:57

标签: ruby

我有一个名为highscore.txt的文件,它将被读入程序并放入一个数组中。问题是我无法对数组进行排序,因为.txt文件中的点被读取为字符串,而不是整数...我该如何解决这个问题?

highscore.txt

Nico,11\nLuis,7...

代码:

@Bestenliste.each do |stat|
  @sorted = @sorted + [stat.to_s.split(",")]
end
@sorted = @sorted.sort {|a,b| a[1] <=> b[1]}
@sorted.each do |stat2|
  puts stat2[0].to_s + " | " + stat2[1].to_s
end

使用stat.to_s.split我将一行(Nico,10)拆分为两个对象,但10将是一个字符串,因此我无法对数组进行排序。

是的,我是以非常复杂的方式做这件事,因为我是Ruby的新手。 ^^

3 个答案:

答案 0 :(得分:1)

array.sort_by(&:to_i) - 将为每个字符串调用#to_i对数组进行排序,并返回仍在字符串中的分数数组 array.map(&:to_i).sort - 相同但会返回一组ints

修改:如果分数为浮点数,则使用to_f代替to_i

答案 1 :(得分:0)

您可以将字符串转换为其他类型。可能是整数或浮动..

对于此文件:

75.89
87.23
81.98
99.40
45.81

从irb看这个片段:

1.9.3-p194 :016 > File.readlines('test.txt').each do |line|
1.9.3-p194 :017 >   puts "#{line} - #{line.class}"
1.9.3-p194 :018?>   puts "#{line.to_i} - #{line.to_i.class}"
1.9.3-p194 :019?>   puts "#{line.to_f} - #{line.to_f.class}"
1.9.3-p194 :020?>   end
75.89 - String
75 - Fixnum
75.89 - Float
87.23 - String
87 - Fixnum
87.23 - Float
81.98 - String
81 - Fixnum
81.98 - Float
99.40 - String
99 - Fixnum
99.4 - Float
45.81 - String
45 - Fixnum
45.81 - Float

答案 2 :(得分:0)

最简单的方法是在比较字符串之前将字符串转换为整数。在您发布的代码中,这就像将.to_i附加到您在数组中排序的值进行比较一样简单:

@sorted = @sorted.sort {|a,b| a[1].to_i <=> b[1].to_i}

正如您似乎已经意识到的那样,Ruby是一种非常强大的语言。做你所做的事情有更多可读,紧凑的方式。例如,执行您所描述的程序可以很容易地用一行或两行来实现:

highscores = File.readlines('highscore.txt').map{|line| line.split(',') }
puts highscores.sort_by{|_, score| score.to_i}.map{|pair| pair.join(" | ")}