Сортировать табло по имени и счету, используя рубин - PullRequest
0 голосов
/ 21 мая 2019

У меня есть текстовый файл, который состоит из них:

player1
10
player2
13
player3
60

Это имя игрока и оценка. Например, счет для игрока 1 равен 10, а для игрока 2 - 13 и так далее. Я хочу отсортировать текстовый файл по баллам. Например:

player3 60
player2 13
player1 10

Ответы [ 2 ]

2 голосов
/ 21 мая 2019

Вам нужно прочитать файл в массив, сделать некоторые манипуляции, а затем записать обратно в файл. Предполагая, что исходный файл содержит пары строк, как показано ..

Сначала прочитайте строки файла в массив, Файл # readlines (примечание, chomp: true для удаления "\n").

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

Получив массив, сгруппируйте каждые два элемента ( Enumerable # each_slice ) и отсортируйте по второму элементу, рассматриваемому как целое число (.to_i) ( Enumerable # sort_by ) , Обратите внимание на знак - для изменения порядка сортировки. В качестве последней операции map ( Enumerable # map ) для join пары элементов во вложенном массиве ( 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 }
0 голосов
/ 21 мая 2019

Базовая реализация этого случая может выглядеть примерно так:

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?Можно ли изменить источник записи?И так далее

...