使用 ruby 按名称和分数对记分板进行排序
Sort scoreboard by name and score using ruby
我有一个包含以下内容的文本文件:
player1
10
player2
13
player3
60
这些是选手姓名和得分。例如,选手 1 的得分是 10,选手 2 的得分是 13,依此类推。我想按分数对文本文件进行排序。例如:
player3 60
player2 13
player1 10
这个案例的基本实现可能是这样的:
def main
file = File.new("score.txt", "r")
players = Array.new
score = Array.new
number_regex = /\A[-+]?[0-9]*\.?[0-9]+\Z/
file.each_line do |line|
if(line.match(number_regex))
score << line.delete(" \t\r\n")
else
players << line.delete(" \t\r\n")
end
end
file.close
result = Hash.new
i = 0
while i < players.length
result[players[i]] = score[i]
i += 1
end
print_score(result)
end
def print_score(hash)
hash.each do |key,value|
puts key + ": " + value
end
end
main
但是,我警告!!!这只是一个基本的实现。这个解决方案有一些副作用,例如,如果数据的数据序列被打破,这个算法将停止工作。
player1
10
player2
player3
60
要实现一个完整的解决方案,您需要在阅读每一行时检查下一行并验证它是否包含所需值的内容。如果序列被打破,并且在 "playerN" 的值之后得分没有消失,那么在这种情况下将它们的缺失视为 0。
一般来说,在这种情况下创建一个整体解决方案并不是一件容易的事。而为了选择最优解,其实你没有提供足够的数据。 .txt 帐户是从哪里记录的?是否可以更改录音来源?等等
您需要将文件读入数组,进行一些操作,然后写回文件。
假设源文件包含成对的行,如图所示..
首先将文件的行读取到数组中,File#readlines(注意,chomp: true
用于剥离"\n"
)。
data = File.readlines('score.txt', chomp: true)
#=> ["player1", "10", "player2", "13", "player3", "60"]
获得数组后,每两个元素分组一次(Enumerable#each_slice) and sort by the second element considered as an integer (.to_i
) (Enumerable#sort_by). Note the -
sign for reversing the order of sorting. As last operation map
(Enumerable#map) to join
the pair of elements in the nested array (Array#join):
score_sorted = data.each_slice(2).sort_by { |_, score| -score.to_i}.map{ |ary| ary.join(' ') }
#=> ["player3 60", "player2 13", "player1 10"]
最后,将数组写回文件(File#open):
File.open("score_sorted.txt", "w+") { |f| f.puts score_sorted }
我有一个包含以下内容的文本文件:
player1
10
player2
13
player3
60
这些是选手姓名和得分。例如,选手 1 的得分是 10,选手 2 的得分是 13,依此类推。我想按分数对文本文件进行排序。例如:
player3 60
player2 13
player1 10
这个案例的基本实现可能是这样的:
def main
file = File.new("score.txt", "r")
players = Array.new
score = Array.new
number_regex = /\A[-+]?[0-9]*\.?[0-9]+\Z/
file.each_line do |line|
if(line.match(number_regex))
score << line.delete(" \t\r\n")
else
players << line.delete(" \t\r\n")
end
end
file.close
result = Hash.new
i = 0
while i < players.length
result[players[i]] = score[i]
i += 1
end
print_score(result)
end
def print_score(hash)
hash.each do |key,value|
puts key + ": " + value
end
end
main
但是,我警告!!!这只是一个基本的实现。这个解决方案有一些副作用,例如,如果数据的数据序列被打破,这个算法将停止工作。
player1
10
player2
player3
60
要实现一个完整的解决方案,您需要在阅读每一行时检查下一行并验证它是否包含所需值的内容。如果序列被打破,并且在 "playerN" 的值之后得分没有消失,那么在这种情况下将它们的缺失视为 0。 一般来说,在这种情况下创建一个整体解决方案并不是一件容易的事。而为了选择最优解,其实你没有提供足够的数据。 .txt 帐户是从哪里记录的?是否可以更改录音来源?等等
您需要将文件读入数组,进行一些操作,然后写回文件。 假设源文件包含成对的行,如图所示..
首先将文件的行读取到数组中,File#readlines(注意,chomp: true
用于剥离"\n"
)。
data = File.readlines('score.txt', chomp: true)
#=> ["player1", "10", "player2", "13", "player3", "60"]
获得数组后,每两个元素分组一次(Enumerable#each_slice) and sort by the second element considered as an integer (.to_i
) (Enumerable#sort_by). Note the -
sign for reversing the order of sorting. As last operation map
(Enumerable#map) to join
the pair of elements in the nested array (Array#join):
score_sorted = data.each_slice(2).sort_by { |_, score| -score.to_i}.map{ |ary| ary.join(' ') }
#=> ["player3 60", "player2 13", "player1 10"]
最后,将数组写回文件(File#open):
File.open("score_sorted.txt", "w+") { |f| f.puts score_sorted }