Ruby - как извлечь конкретный элемент из массива - PullRequest
0 голосов
/ 18 ноября 2018

Как проще всего было бы в Ruby извлечь конкретный элемент из массива, аналогично методу .delete для

a.delete(element)

, вместо того, чтобы выталкивать первый / последний элемент или использовать .slice?

Чтобы сделать это более конкретно: например, я могу сделать

case names.sample when "John", "Dave", "Sam"
  a.delete(names.sample)
end

, чтобы удалить одно из этих имен из a, когда оно появляется в качестве образца из names

Однако я намерен использовать несколько выборок, и использование a.delete() удалит все элементы сразу, а не подряд, как результат, полученный в shuffle!.pop, где элементы выталкиваются последовательно, так что имя больше не может бытьвыбранный в качестве образца из a после того, как то же имя было выбрано как name.sample

Мне было интересно, как проще всего было бы в Ruby вытолкнуть эти элементы подряд или, если это дажевообще возможно в этом контексте.

Ответы [ 2 ]

0 голосов
/ 18 ноября 2018

[..] намеревается использовать несколько выборок, а a.delete() удалит все элементы сразу, а не подряд, как результат, полученный в shuffle!.pop, где элементы выталкиваются последовательно, так что имя больше не может быть выбран в качестве образца из после того же имени было выбрано как name.sample [..]

Может быть, ты выглядишь примерно так?

names = ["John", "Dave", "Sam"]

names.size.times { p names.delete(names.sample) }

#=> "Sam"
#=> "John"
#=> "Dave"
0 голосов
/ 18 ноября 2018

Класс Array определяет метод pop. Возвращает и удаляет последний элемент в массиве.

a = ["a", "b", "c"]
puts a.pop #=> "c"
puts a     #=> ["a", "b"]

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

a = ["a", "b", "c"]
puts a.pop(2) #=> ["b", "c"]
puts a        #=> ["a"]

Обращаясь к вашему последнему комментарию, вы можете использовать методы include?, index и delete_at для достижения этой цели. Предполагая, что вы проверяете «b» в массиве:

a = ["a", "b", "c"]

value_index = a.index("b") #Returns the first occurring index of "b"
has_value = a.include?("b") #Returns whether "b" is in the list
a.delete_at(a.index("b")) if has_value #Removes "b" from the list

В этом примере «has_value» будет указывать, содержит ли массив a значение «b», а «value_index» будет первым появлением «b». Это также приведет к удалению значения «b» из списка.

Если вы хотите удалить все вхождений "b", вы можете использовать include?, index и delete_at с циклом while:

a = ["a", "b", "c", "a", "b", "c"]

while a.include?("b")
    a.delete_at(a.index("b"))
end
#a will now be ["a", "c", "a", "c"]

См. Также документацию по массиву .

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