2011-04-20 66 views
4

指數由於包含字符串索引的順序,刪除字符由紅寶石字符串

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

什麼是從字符串排除這些最好的方法是什麼?

例如,給定上述標記爲排除的索引和字符串happydays,我想要返回hpyda

+1

什麼是Ruby版本? – fl00r 2011-04-20 19:05:28

+0

1.8.7 ...感謝所有的答案,我正在運行一些測試 – mbm 2011-04-20 19:20:55

+0

更好地使用Array of Ranges更加本地化。 '[(1..2),(7..8),(10..20)]' – fl00r 2011-04-21 10:14:06

回答

6

使用範圍:

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} 
+0

你怎麼知道他的意思是範圍? :)我只是一個奇怪的多維數組。 – fl00r 2011-04-21 10:13:47

+0

「包含」表示「範圍」給我。 – AShelly 2011-04-22 05:12:03

1

爲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
[[1,2],[7,8]].reverse.inject('happydays') { |m, (f,l)| m[f..l] = ''; m } 
2

猜猜這是做這件事的最好方法。

str_indices = str_indices.flatten.reverse 
string = "happydays" 
str_indices.each{|i| string[i]=""} 
+0

我相信這是! – fl00r 2011-04-20 19:14:17

+0

除非您的索引是[[1,2],[6,8]]。這會返回「hpydy」而不是「hpyd」。 – AShelly 2011-04-20 19:42:09

+0

@AShelly:是的,你是對的。我沒有很好地閱讀這個問題。爲了解決這個問題,當我扁平數組時,會增加一個額外的步驟。 – 2011-04-20 20:16:54

0

只是爲了好玩:)

str_indices = [[1,2],[7,8]] 
str = "happydays" 
str_indices.flatten.reverse.inject(str.split("")){|a,i| a.delete_at i; a}.join 
#=> hpyda 
0

如果使用一個功能性的編程方法,你不必擔心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 
0

下不需要通過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"