удаление массива элементов на основе первой буквы элемента для RUBY - PullRequest
0 голосов
/ 01 ноября 2009

Я зашел на http://ruby -doc.org / core / classes / Array.html # M002198 и не могу найти способ взять массив имен, например

people = [chris,george,jerry,bob,bill,julie,josh]

Я хочу, чтобы пользователь мог выбрать букву "b", затем нажать клавишу ввода, извлечь все элементы с первой буквой "b" и поместить их в отдельный массив. В этом случае это будет [Боб, Билл] Команда .slice должна работать для этого, но я не знаю, как сказать, чтобы просто посмотреть на первую букву элементов? Будет ли это какой-то аргумент, который должен быть заполнен, как этот people.slice ()

people_selector = gets.chomp.to_s
people.slice(people_selector)
print people

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

Ответы [ 5 ]

9 голосов
/ 01 ноября 2009

Вы, вероятно, хотите select, а не slice:

$ irb
>> people = ["chris", "bob", "bill", "julie"]
=> ["chris", "bob", "bill", "julie"]
>> letter = gets.chomp.downcase
B
=> "b"
>> people.select { |person| person[0,1] == letter }
=> ["bob", "bill"]

Кроме того, нет необходимости добавлять to_s к gets.chomp; у вас уже должна быть строка.

В Ruby 1.9 вы могли бы вместо этого сделать:

>> people.select { |person| person[0] == letter }
=> ["bob", "bill"]

В Ruby 1.9 индексирование в строку всегда возвращает строку; в более ранних версиях индексирование с одним значением в строку дает вам символ. Другой вариант, который должен работать во всех версиях, будет:

>> people.select { |person| person[0] == letter[0] }
=> ["bob", "bill"]
3 голосов
/ 01 ноября 2009

если вы хотите удалить элементы из исходного массива, а также поместить их в новый массив, взгляните на раздел

>> people = "chris,george,jerry,bob,bill,julie,josh".split(",")
=> ["chris", "george", "jerry", "bob", "bill", "julie", "josh"]
>> bs, people = people.partition {|name| name[0,1] == 'b'}
=> [["bob", "bill"], ["chris", "george", "jerry", "julie", "josh"]]
>> bs
=> ["bob", "bill"]
>> people
=> ["chris", "george", "jerry", "julie", "josh"]
1 голос
/ 02 ноября 2009

Это также работает, хотя и немного менее эффективно, чем у Брайана, но гораздо более гибко.

>> a = ['bob', 'abe', 'fred', 'bill']
=> ["bob", "abe", "fred", "bill"]
>> a.select{|s| s =~ /^b/}
=> ["bob", "bill"]
1 голос
/ 01 ноября 2009

Короткий ответ: вы можете использовать select:

people.select {|person| person[0,1] == letter}

Вот пример реализации. Во-первых, у нас есть модульный тест, описывающий, что должно произойти:

class PeopleListTest < Test::Unit::TestCase
   def setup
      @people = PeopleList.new "jack", "jill", "bruce", "billy"
   end

   def test_starting_with
      assert_equal ["bruce", "billy"], @people.starting_with("b")    
      assert_equal ["jack", "jill"], @people.starting_with("j")    
      assert_equal [], @people.starting_with("q")    
   end
end

Если это то, что вы пытаетесь сделать, то код для этого прохода:

class PeopleList
   def initialize *people
      @people = people    
   end

   def starting_with letter
      return @people.select {|person| person[0,1] == letter}
   end
end

Надеюсь, это поможет. Удачи.

0 голосов
/ 01 ноября 2009

Вы получите больше пробега от сбора, чем от среза

http://ruby -doc.org / ядро-1.9 / классы / Array.html # M000444

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...