2011-10-11 17 views
0

我有一個這樣的數據集: http://pastie.org/private/3u1reg72nnjfsgqzgqzwra如何使用子字符串變體對一個子字符串優先於另一個字符串進行重複數組刪除操作?

這個列表是一組需要處理的文件名。當一個子字符串爲10u的文件名與一個子字符串2u一起存在時,其中10u的文件名具有2u子字符串的文件中的一部分數據。換句話說,當你有這樣的:

20021203_V9ut_2u.txt 
20021203_V9ut_10u.txt 
    or 
V9cd_2u.txt 
V9cd_10u.txt 

20021203_V9ut_10u.txtV9cd_10u.txt應該從列表中刪除,並僅與1u文件名應保持在列表中。

我已經嘗試了幾種不同的方法,但他們都覺得太像C或hackish。我也考慮過拆分字符串,然後用1u10u的值構建散列,然後如果其中存在10u值的密鑰存在,請將其替換爲1u,否則將其丟棄,然後將散列重新映射到數組中處理文件內容。

什麼是「最好」或最紅寶石般的方式來做到這一點,你可以提供一個例子嗎?

回答

2

如果你的文件列表有時含有沒有2u和10u完美匹配的文件可以幫助你。它除去10u文件,當且僅當存在相應的2u文件時,否則將其留在結果列表中。

files = %w(20021203_V9ut_2u.txt 
20021203_V9ut_10u.txt 
V9cd_2u.txt 
V9cd_10u.txt 
test1_2u.txt 
thing2_10u.txt) 

# Reverse sort them if they aren't already that way 

files = files.sort {|a,b| b <=> a } 

puts files.inspect 

scrubbed_files = [] 
files.each_with_index { |f,i| 
    scrubbed_files << f unless f =~ /(.*)_10u\.(.*)/ && files[i-1] =~ /#{$1}_2u\.#{$2}/ 
} 

puts scrubbed_files.inspect 
+0

非常完美,非常感謝! – ylluminate

2

假設你有all_filenames數組作爲字符串:

filenames_2u = all_filenames.reject!{ |f| f =~ /10u/ } # edited to be actual working ruby 

編輯如果您提供的文件是你正在使用的是什麼:

all_filenames = IO.readlines('filenames.txt') 
+0

目前您只能刪除陣列中存在10u的元素。當字符串(文件名)的剩餘部分匹配並且存在1u的文件名時,我實際上只需要移除10u。請查看原始說明,其中顯示了當您有時,例如:V9cd_2u.txt&V9cd_10u.txt - 只應刪除V9cd_10u.txt。 – ylluminate

+0

我現在明白了。讓我看看我能不能拿出一些東西。 – bricker

+0

來自@ctcherry的其他答案效果很好。如果您願意,歡迎您進一步研究或提出不同的解決方案!謝謝參觀。 – ylluminate

1

這種方式是更有趣:

a.map {|x| x.split(/_/)}.group_by {|x| x[0...-1]}.map {|_,xx| xx.sort_by {|x| x.last.to_i}.first.join("_")} 

即,在下劃線的名稱分成數組,組這些由莖(零件直到最後下劃線),然後爲每個組按最後一位的整數版本對名稱進行排序,並取第一個。

這將適用於任何Xu編號方案,所以如果你有2u和5u和10u,你會得到2u版本,如果你有10u和20u,你會得到10u。

group_by很酷。

+0

漂亮華麗。我會研究這個。 – ylluminate

相關問題