Сортировка массива с несколькими переменными - PullRequest
0 голосов
/ 12 октября 2011

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

name_list = {}
puts 'please enter names seperated by a space:'
name_list = gets.chomp
names = name_list.split(" ")

чтобы захватить имена ...

names.sort do |a,b| a.upcase <=> b.upcase end
display = "#{names}"
for ss in 0...display.length
       print ss, ": ", display[ss], "\n"
end

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

EDIT

У меня также была идея использовать класс. но мне нужно было бы запрограммировать имена так, чтобы пользователь мог добавлять информацию через консоль. класс А

def initialize (name) @name = имя конец def to_s @ name.reverse конец конец

>> a = [A.new("greg"),A.new("pete"),A.new("paul")]

>> puts a

Ответы [ 3 ]

3 голосов
/ 12 октября 2011

Проблемы в вашем коде:

  • name_list определен как пустой хеш в верхней части, но не используется.
  • split ("") -> split
  • сортировать {| a, b |a.method <=> b.method} -> sort_by {| x |x.method} -> sort_by (&: method)
  • сортировка не является операцией на месте, присвойте результат (или используйте его напрямую).
  • display = "# {names}"-> display = names
  • для сс в 0 ... display.length -> enumerable.each_with_index {| item, index |...}
  • не пишите do / end в одной строке, используйте {...}

Я бы написал:

puts 'Please enter names separated by spaces'
gets.split.sort_by(&:upcase).each_with_index do |name, index|
  puts "%s: %s" % [index, (index % 2).zero? ? name : name.reverse]
end
2 голосов
/ 12 октября 2011

Затем несколько указателей:

names.sort do |a,b| a.upcase <=> b.upcase end # Will not modify the "names" array, but will return a sorted array.
names.sort! do |a,b| a.upcase <=> b.upcase end # Will modify the "names" array.

Для отображения ваших имен:

names.each_with_index do |name, index|
    if index % 2 == 0
        puts name
    else
        puts name.reverse
    end
end
1 голос
/ 12 октября 2011
puts 'please enter names seperated by a space`enter code here` :'
names = gets.chomp.split(" ")

names.sort! {|a,b| a.upcase <=> b.upcase }  # For a single line use {..} instead of do..end

names.each_with_index do |n,i|
  if i % 2 == 0
    p n
  else
    p n.reverse
  end
end

Вы также можете использовать троичный оператор, я использовал полный блок if else для удобства чтения в этом случае.

names.each_with_index do |n,i|
  p (i % 2 == 0) ? n : n.reverse
end

EDIT

command = ""
names = []
while command != "exit"
  puts 'please enter names seperated by a space`enter code here` :'

  command = gets.chomp!

  if command == "display"
    names.sort! {|a,b| a.upcase <=> b.upcase }  # For a single line use {..} instead of do..end        
    names.each_with_index do |n,i|
      if i % 2 == 0
        p n
      else
        p n.reverse
      end
    end
  else
    names << command
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...