2016-12-04 2 views
0

Я подаю в суд на Ruby 2.3. Когда я хочу, чтобы удалить строку элемент из массива по значению, я могу сделатьКак удалить элемент из массива без учета регистра?

2.3.0 :005 > a.delete("AB") 
=> "AB" 

но как удалить элемент в регистронезависимом образом? То есть, как я могу сделать

a.delete(“ab”) 

ведут себя как

a.delete(“AB”) 

?

+2

В будущем подумайте, чтобы подождать до выбора ответа. Быстрый выбор может препятствовать другим ответам и короткому замыканию, которые все еще готовят ответы. Там нет спешки. Многие здесь ждут как минимум пару часов, некоторые ждут гораздо дольше. –

ответ

0

Попробуйте delete_if

a.delete_if { |s| s.downcase == 'ab' } 
0

Вы можете использовать Array#reject вместо этого, как это:

bad_string_downcase = bad_string.downcase 
a.reject! { |element| element.downcase == bad_string_downcase } 

Или с помощью регулярных выражений:

a.reject! { |element| element.match %r{^#{bad_string}$}i } 
1

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

arr = ['aB', 'cd', 'Ab', 'ef'] 

def delete_first(arr, target) 
    ndx = arr.index { |s| s.downcase == target } 
    ndx.nil? > nil : arr.delete_at(ndx) 
end 

delete_first(arr, 'ab') 
    #=> "aB" 
arr 
    #=> ["cd", "Ab", "ef"] 

delete_first(arr, 'de') 
    #=> nil 
arr 
    #=> ["aB", "cd", "Ab", "ef"] 

Чтобы удалить последний экземпляр target в arr просто заменить index с rindex.

См. Array#delete_at, Array#index и Array#rindex.

1
a.reject!{|str| str.casecmp("AB").zero?} 

casecomp является регистронезависимой версией String#<=>.
a.reject!{|str| str.casecmp("ab").zero?} ведет себя точно так же.

+0

Мне не было известно о 'casecmp'. Он читается намного лучше, чем уменьшение или увеличение одного (иногда оба) сравниваемых строк. –

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