按名称对记分牌进行排序并使用ruby进行评分

时间:2019-05-21 06:38:14

标签: ruby libgosu

我有一个包含以下内容的文本文件:

player1
10
player2
13
player3
60

这些是球员的名字和得分。例如,玩家1的得分为10,玩家2的得分为13,依此类推。我想按分数对文本文件进行排序。例如:

player3 60
player2 13
player1 10

2 个答案:

答案 0 :(得分:2)

您需要将文件读入数组,进行一些操作,然后写回文件。 假设源文件包含如图所示的成对的行。

首先将文件的各行读入数组File#readlines(注意,chomp: true用于剥离"\n")。

data = File.readlines('score.txt', chomp: true)
#=> ["player1", "10", "player2", "13", "player3", "60"]

一旦有了数组,就对每两个元素(Enumerable#each_slice)进行分组,并按被视为整数({{1})(Enumerable#sort_by)的第二个元素进行排序。请注意.to_i符号用于颠倒排序顺序。作为最后一个操作-Enumerable#map)到map嵌套数组(Array#join)中的一对元素:

join

最后,将阵列写回到文件(File#open):

score_sorted = data.each_slice(2).sort_by { |_, score| -score.to_i}.map{ |ary| ary.join(' ') }
#=> ["player3 60", "player2 13", "player1 10"]

答案 1 :(得分:0)

这种情况的基本实现可能是这样的:

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帐户是从哪里记录的?是否可以更改记录的来源?等等