2013-06-27 8 views
34

यह मेरे लिए एक आम, दोहराव मुहावरे है: एक नियमित अभिव्यक्ति का उपयोग करके एक सरणी फ़िल्टर करना, और उप-सरणी लौटना। मेरा दृष्टिकोण बहुत रूबी जैसा नहीं लगता है (मैं जावा से आया हूं)। मैं कई विधियों को समाप्त करता हूं जो इस तरह बहुत दिखते हैं।रूबी: रेगेक्स द्वारा फ़िल्टर सरणी?

इस कोड को बेहतर बनाने के लिए मूर्खतापूर्ण रूबी तरीका क्या है?

def get_all_gifs(items_) 
    output = Array.new 
    filter = /\.jpg$/ 
    items_.each do |item| 
    next if item =~ filter 
    output << item 
    end 
    output 
end 
+0

फ़ाइल नाम तुम कैसे हो रही है का उपयोग करें? यदि डिस्क से यदि आप 'Dir.glob (' *। Jpe? G ')' –

+0

'का उपयोग करके नाम पुनर्प्राप्त करते हैं तो आप उन्हें फ़िल्टर कर सकते हैं। मुझे लगता है कि लगभग सभी ने मेरे प्रश्न को गलत समझा (शायद क्योंकि मैंने इसे बुरी तरह से पूछा था)। उदाहरण बहुत लोड हो सकता है। यह छवियों या फ़ाइल नाम या फ़ाइल एक्सटेंशन के बारे में नहीं है। यह सरणी के फ़िल्टरिंग के बारे में है, और ऐसा करने के तरीकों के लिए एक बेहतर मुहावरे है। – allanberry

उत्तर

55

आप सभी gifs पता लगाना चाहते हैं:

def get_all_gifs(files) 
    files.select{ |i| i[/\.gif$/] } 
end 

आप सभी jpegs पता लगाना चाहते हैं:

def get_all_jpgs(files) 
    files.select{ |i| i[/\.jpe?g$/] } 
end 

उन्हें चल रहा है:

files = %w[foo.gif bar.jpg foo.jpeg bar.gif] 
get_all_gifs(files) # => ["foo.gif", "bar.gif"] 
get_all_jpgs(files) # => ["bar.jpg", "foo.jpeg"] 

लेकिन रुकिए! अभी और है!

अगर आप उनके प्रकार द्वारा उन सब को समूह चाहते हैं, तो विस्तार ?:

def get_all_images_by_type(files) 
    files.group_by{ |f| File.extname(f) } 
end 

यहाँ के आधार पर निकालने क्या फ़ाइलों के प्रकार है:

get_all_images_by_type(files).keys # => [".gif", ".jpg", ".jpeg"] 

यहाँ विशेष प्रकार हड़पने करने का तरीका बताया :

get_all_images_by_type(files) # => {".gif"=>["foo.gif", "bar.gif"], ".jpg"=>["bar.jpg"], ".jpeg"=>["foo.jpeg"]} 
get_all_images_by_type(files)['.gif'] # => ["foo.gif", "bar.gif"] 
get_all_images_by_type(files).values_at('.jpg', '.jpeg') # => [["bar.jpg"], ["foo.jpeg"]] 
15
$ cat foo.rb 
images = %w[foo.gif foo.png foo.jpg bar.jpeg moo.JPG] 
jpgs = images.select{|e| e =~ /\.jpe?g$/i} 
puts jpgs.inspect 

$ ruby foo.rb 
["foo.jpg", "bar.jpeg", "moo.JPG"] 

अपने regexp में बदल दें ताकि आप "jpeg" इसके अलावा में करने के लिए "jpg" मामले की परवाह किए बिना से मेल कर सकते हैं।

+1

"चयन" विधि वह है जो मैं यहां देख रहा हूं (या बल्कि "अस्वीकार" विधि, अब मुझे यह मिला है)। धन्यवाद। – allanberry

18

Enumerable.grep पर एक नज़र डालें, यह टी खोजने/फ़िल्टर करने का एक बहुत शक्तिशाली तरीका है कुछ भी गिनती में छल्ले।

+0

यह डिकेंस की तरह काम करता है। मैं शायद अब से इसका उपयोग करूंगा, लेकिन एक संकीर्ण अर्थ में, "चयन" विधि यह है कि मैं इस प्रश्न के बाद क्या था। बहुत बहुत धन्यवाद। – allanberry

+0

हां, 'grep' बहुत अच्छा है, क्योंकि यह रिसीवर के तत्वों की तुलना' grep' के तर्क से '===' करता है। यह आपको लिखने की अनुमति देता है, उदाहरण के लिए, '["abc", "bcd", "cbd"]। Grep (/। B। /) # => ["Abc", "cbd"] 'और {[{a : 1}, 4, {बी: 2}, "टोपी"]। Grep (हैश) # => [{: ए => 1}, {: बी => 2}] '। –

3

हम इस विशिष्ट समस्या के लिए regex के बिना जा सकते हैं। String#end_with?

images = %w[foo.gif foo.png foo.jpg bar.jpeg moo.JPG] 
images.find_all{|e| e.end_with?(".jpg",".jpeg")} 
# => ["foo.jpg", "bar.jpeg"] 
9
images = %w[foo.gif foo.png foo.jpg bar.jpeg moo.JPG] 
images.grep(/.jpg/g) # => ["foo.jpg", "moo.JPG"] 
0
ta, tb = files.partition{|f| f[/(.*\.jpe*g)/]} 

ap ta 
[ 
    [0] "bar.jpg", 
    [1] "foo.jpeg" 
] 


ap tb 
[ 
    [0] "foo.gif", 
    [1] "bar.gif" 
] 

/gucio

संबंधित मुद्दे