Удаление символов по индексу из Ruby String - PullRequest
4 голосов
/ 20 апреля 2011

Учитывая последовательность включающих строковых индексов,

str_indices = [[1,2],[7,8]],

Каков наилучший способ исключить их из строки?

Например, с учетом вышеуказанных индексов, помеченных для исключения, и строкиhappydays, я бы хотел, чтобы hpyda был возвращен.

Ответы [ 7 ]

6 голосов
/ 20 апреля 2011

Использование диапазонов:

str_indices=[[1,2],[7,8]]
str="happydays"
str_indices.reverse.each{|a| str[Range.new(*a)]=''}
str
=> "hpyda"

Если вы не хотите изменять оригинал:

str_indices.reverse.inject(str){|s,a|(c=s.dup)[Range.new(*a)]='';c}
2 голосов
/ 20 апреля 2011

Думаю, это лучший способ сделать это.

str_indices = str_indices.flatten.reverse
string = "happydays"
str_indices.each{|i| string[i]=""}
1 голос
/ 20 апреля 2011
[[1,2],[7,8]].reverse.inject('happydays') { |m, (f,l)| m[f..l] = ''; m }
1 голос
/ 20 апреля 2011

Для ruby ​​1.9,

string = 'happydays'
[-1, *str_indices.flatten(1), 0].each_slice(2).map{|i, j| string[i+1..j-1]}.join

Для ruby ​​1.8 напишите require 'enumerator' перед этим.

0 голосов
/ 17 ноября 2016

Следующее не требует, чтобы диапазоны, обозначенные str_indices, не перекрывались и не заказывались каким-либо образом.

0 голосов
/ 21 апреля 2011

Если вы используете подход функционального программирования, вам не нужно беспокоиться о порядке индексов

str = "happydays"
indexes_to_reject = [[1,7],[2,8]] # Not in "correct" order, but still works
all_indexes = indexes_to_reject.flatten(1)
str.each_char.reject.with_index{|char, index| all_indexes.include?(index)}.join

Также работает с диапазонами:

str = "happydays"
ranges_to_reject = [1..2, 7..8]
str.chars.reject.with_index {|char, index| 
  ranges_to_reject.any?{|range| range.include?(index)}
}.join
0 голосов
/ 20 апреля 2011

Просто для удовольствия:)

str_indices = [[1,2],[7,8]]
str = "happydays"
str_indices.flatten.reverse.inject(str.split("")){|a,i| a.delete_at i; a}.join
#=> hpyda
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...