指數由於包含字符串索引的順序,刪除字符由紅寶石字符串
str_indices = [[1,2],[7,8]],
什麼是從字符串排除這些最好的方法是什麼?
例如,給定上述標記爲排除的索引和字符串happydays
,我想要返回hpyda
。
指數由於包含字符串索引的順序,刪除字符由紅寶石字符串
str_indices = [[1,2],[7,8]],
什麼是從字符串排除這些最好的方法是什麼?
例如,給定上述標記爲排除的索引和字符串happydays
,我想要返回hpyda
。
使用範圍:
str_indices=[[1,2],[7,8]]
str="happydays"
str_indices.reverse.each{|a| str[Range.new(*a)]=''}
str
=> "hpyda"
如果你不想modifty原文:
str_indices.reverse.inject(str){|s,a|(c=s.dup)[Range.new(*a)]='';c}
爲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'
在此之前。
[[1,2],[7,8]].reverse.inject('happydays') { |m, (f,l)| m[f..l] = ''; m }
猜猜這是做這件事的最好方法。
str_indices = str_indices.flatten.reverse
string = "happydays"
str_indices.each{|i| string[i]=""}
只是爲了好玩:)
str_indices = [[1,2],[7,8]]
str = "happydays"
str_indices.flatten.reverse.inject(str.split("")){|a,i| a.delete_at i; a}.join
#=> hpyda
如果使用一個功能性的編程方法,你不必擔心RY有關索引
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
下不需要通過str_indices
確定爲不重疊或以任何方式訂購的範圍。
str_indices = [[4,6], [1,2], [11,12], [9,11]]
str = "whatchamacallit"
keeper_indices = str.size.times.to_a -
str_indices.reduce([]) { |a,(from,to)| a | (from..to).to_a }
# => [0, 3, 7, 8, 13, 14]
str.chars.values_at(*keeper_indices).join
#=> "wtmait"
什麼是Ruby版本? – fl00r 2011-04-20 19:05:28
1.8.7 ...感謝所有的答案,我正在運行一些測試 – mbm 2011-04-20 19:20:55
更好地使用Array of Ranges更加本地化。 '[(1..2),(7..8),(10..20)]' – fl00r 2011-04-21 10:14:06