2015-05-30 4 views
0

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

Что я сделал, это поместить 5 походов в двумерном массиве , Каждый массив включает имя, местоположение, сложность и длину похода. Я хочу, чтобы пользователь вводил свои настройки, а затем распечатывал соответствующие походы.

E.g. Если пользователь входит в 6 км, я хочу распечатать имена походов от массивов, которые являются < = 6 км.

Так что я хочу, чтобы напечатать следующий код, но только тогда, когда [0] < = 6 в "# {походах [я] [0]}"

hikes.each_index{|i| puts "#{hikes[i][0]} " } 

Спасибо за помощь!

Вот мой код до сих пор:

#Hiking Array: [Hike Name, Location, Difficulty, Length(km)] 

    hikes = 
    [["Admiralty Point", "Tri Cities", "Easy", 5], 
    ["Habrich Ridge Trail", "Howe Sound", "Intermediate", 7], 
    ["Aldergrove Regional Park", "Surrey", "Easy", 5], 
    ["Alice Lake", "Howe Sound", "Easy", 6], 
    ["Ancient Cedars Trail", "Whistler", "Intermediate", 5]] 


    puts "It's the weekend! Where should we go hiking?\n\n" 
    puts "Here is the list of available hikes." 
    puts "___________________________" 

    hikes.each_index{|i| puts "#{hikes[i][0]} " } 

    puts "\n" 
    puts "How many kilometers do we want to hike?" 
    kilometers = $stdin.gets.chomp 

    puts "\n" 
    puts "How hard do we want the hike to be, Easy or Intermediate?" 
    difficulty = $stdin.gets.chomp 

    puts "\n" 
    puts "What area of town do we want to hike in:" 
    puts "Tri Cities" 
    puts "Howe Sound" 
    puts "Surrey" 
    puts "Whistler" 
    area_of_town = $stdin.gets.chomp 

    puts "\n" 
    puts "Ok searching for awesome views that are #{kilometers}km, of #{difficulty} difficulty, and are in #{area_of_town}." 

    hikes.each_index{|i| puts "#{hikes[i][2]}"} 
+1

Было бы лучше спросить, если вы сузить код вниз, как удаление всего, что не связано с основной проблемой. Прочитайте [Как создать минимальный, полный и проверяемый пример] (http://stackoverflow.com/help/mcve) –

+0

Не перебирайте по индексу, если это необходимо. 'Hikes.each {| поход | puts "# {hike [0]}"} ' – steenslag

+0

Понял, спасибо. – Chris

ответ

0

Может быть

hikes.select {|arr| arr[3] <= 5}.each{|arr| puts arr[0]} 

Но я бы предложил использовать хэш, так что вы можете использовать имя атрибута, который вы ищете.

hikes = [{'location'=>'Admirality', 'difficulty'=>5}, {'location'=>'Admirality', 'difficulty'=>10}, {'location'=>'Admirality', 'difficulty'=>15}] 

hikes.select {|hsh| hsh["difficulty"] <= 10} 
+0

Спасибо за помощь! Это похоже на хеши, это более простой способ сделать это. – Chris

0

Просто используйте «и» оператор && печатать имена из вложенных массивов, если они соответствуют всем 3 условия, как:

hikes.each do |h| 
    puts h[0] if (h[3] <= kilometers && 
        h[2].downcase == difficulty.downcase && 
        h[1].downcase == area_of_town.downcase) 
end 
  • я преобразовал все строки в downcase перед сопоставлением, на всякий случай пользовательский ввод не соответствует случаю с строкой массива (например, "Easy" vs "easy")
  • Если вы хотите распечатать все детали совпадающих массивов, измените puts h[0] на puts h.join(', ').
0

Вы могли бы рассмотреть возможность сделать это следующим (после упрощения, устраняя некоторые экскурсии атрибуты):

hikes = 
    [["Admiralty Point", 5], 
    ["Habrich Ridge Trail", 7], 
    ["Aldergrove Regional Park", 5], 
    ["Alice Lake", "Howe Sound", 6], 
    ["Ancient Cedars Trail", 5]] 

HIKES_BY_DISTANCE = 
    hikes.each_with_object(Hash.new {|h,k| h[k] = []}) {|a,h| h[a.last] << a} 
    #=> {5=>[["Admiralty Point", 5], 
    #  ["Aldergrove Regional Park", 5], 
    #  ["Ancient Cedars Trail", 5]], 
    # 7=>[["Habrich Ridge Trail", 7]], 
    # 6=>[["Alice Lake", "Howe Sound", 6]]} 

def select_hikes(length_range) 
    HIKES_BY_DISTANCE.each_with_object([]) do |(k,v),a| 
    a.concat(v) if length_range.cover?(k) 
    end 
end 

select_hikes(4..5) 
    #=> [["Admiralty Point", 5], 
    # ["Aldergrove Regional Park", 5], 
    # ["Ancient Cedars Trail", 5]] 
select_hikes(2..6) 
    #=> [["Admiralty Point", 5], 
    # ["Aldergrove Regional Park", 5], 
    # ["Ancient Cedars Trail", 5], 
    # ["Alice Lake", "Howe Sound", 6]] 
select_hikes(4..7) 
    #=> [["Admiralty Point", 5], 
    # ["Aldergrove Regional Park", 5], 
    # ["Ancient Cedars Trail", 5], 
    # ["Habrich Ridge Trail", 7], 
    # ["Alice Lake", "Howe Sound", 6]] 
select_hikes(6..9) 
    #=> [["Habrich Ridge Trail", 7], 
    # ["Alice Lake", "Howe Sound", 6]] 
select_hikes(7..7) 
    #=> [["Habrich Ridge Trail", 7]] 
select_hikes(1..2) 
    #=> [] 
select_hikes(8..9) 
    #=> [] 
+0

Да, похоже, хеши могут быть лучшим способом сделать это. Это полезно, спасибо. – Chris

Смежные вопросы