2014-12-10 5 views
1

Я хочу, чтобы код был заменен на существующие имена, когда счетчик больше текущего в файле.Удалить конкретный элемент в массиве

файл выглядит следующим образом: http://i.stack.imgur.com/LuQwp.png Это код:

def highscore(name,score) 
    a = File.new("highscore.txt", "w") 
    if @Bestenliste.include?("#{name}") 
    x = @Bestenliste.index("#{name}") 
    @Bestenliste.delete_at(x) 
    end 
    @Bestenliste = @Bestenliste + [name.to_s + "," + score.to_s] 
    a.puts @Bestenliste 
    a.close 
end 

Проблема заключается в том, что имя и точки в массиве не индивидуальные, а если я хочу, чтобы изменить это я необходимо изменить всю мою программу. Могу ли я каким-то образом использовать подстановочные знаки или что-то подобное в названии, а также сравнить счет в то же время?

Я хочу, чтобы перезаписать определенное имя, когда он уже существует и оценка выше

+0

Ваш вопрос непонятен. Что такое ввод образца? Каков желаемый результат? – ptd

+0

То, что текущий выход также будет хорошо знать. Если я правильно читаю код, я думаю, что 'include' и связанные с ним операторы не работают, потому что вы ищете только' имя', а не 'name.to_s +", "+ score.to_s'. Но трудно ответить, не зная, что вы пытаетесь получить в результате. –

+0

Программа должна переписывать имена, когда она уже существует, и оценка выше, но она не работает, потому что имя и оценка в массиве не разделены. Массив выглядит так: '[" nico, 6 \ n "," henrik, 9 \ n "," luis, 2 \ n "]' Новые строки есть из-за того, что массив загружается из файла. – Splinti

ответ

0

Итак, вы хотите использовать регулярное выражение для поиска по вашему массиву и замены определенного индекса, если он найден? Отметьте this сообщение об использовании регулярного выражения для поиска по массиву. Я думаю, вы должны быть в состоянии использовать ответ Младена Яблановича. Вы можете прочитать, как использовать совпадение Ruby String = ~ regex here.

Я думаю, что вы могли бы добиться этого с помощью

x = @Bestenliste.index{|e| e =~ /#{Regexp.quote(name)}.*/ } 
unless x.nil? 
    @Bestenliste.delete_at(x) 
end 
@Bestenliste = @Bestenliste + [name.to_s + "," + score.to_s] 

я использовал this для создания и тестирования регулярных выражений и this stackoverflow post для интерполяции строк.

+0

Спасибо за ответ, после того, как я в первый раз выиграл его, просто написал счет в пустом рекорде. текст. Попробовав его во второй раз, он сказал 'ln 38: in '*': неправильное количество аргументов: это строка:' x = @ Bestenliste.index {| e | e = ~ /#{Regexp.quote(name).*}/} ' – Splinti

+0

О, я допустил ошибку в своем регулярном выражении! Я включил интерполяцию после проверки. '.* 'должен находиться снаружи}, поэтому он должен выглядеть как'/# {Regexp.quote (name)}. */'. Я отредактирую свой ответ, чтобы это отразить. –

+0

Хорошо, теперь он говорит '35: in 'highscore': undefined method 'delete_at' для nil: NilClass' Разве я разбил массив сейчас? – Splinti

1

Я думаю, что ваша программа будет более эффективной, если вы перемещаете данные в хэш вместо массива.

array.each {|set| set.split(",")} 
array=array.to_h 

Тогда вы можете легко просто сравнить значения и заменить их.

if num > array[name] 
    array[name]=num 
end 

Альтернатива, насколько мне известно, будет заключаться в том, чтобы разделить значение, когда вы сравниваете. Я не вижу в вашей программе никакого сравнения. Что-то вроде

@Bestenlite.split(",") 
    if @Bestenliste[0]==name 
    if @Bestenliste[1].to_i<score 

что-то вроде этого, но это сильно осложнит ваш код.

+0

Спасибо за ответ, если честно, я никогда не использовал хэш раньше, поэтому я просто использовал массив, как все. Я должен прочитать немного, чтобы я мог это сделать. Спасибо за совет! – Splinti

+0

Как только вы их получите, они очень полезны. Удачи. http://www.ruby-doc.org/core-2.1.5/Hash.html#method-i-to_h –