2014-02-26 36 views
0

我試圖將目錄中的文件與其他目錄中的其他文件及其子目錄中的文件匹配使用ruby。bsearch與ruby之間的區別

我嘗試使用這個文件的架構做一個小試驗:

tree . 
. 
├── src 
│   ├── lol 
│   │   └── toto 
│   └── lolilolpouet 
│    └── tutu 
│     └── tata 
├── test 
│   ├── tata 
│   └── toto 
└── test.rb 

我的Ruby代碼是:

require 'find' 

src_dir_files = [] 
Find.find('./src') do |file| 
    src_dir_files << file 
    puts "found #{file}" 
end 


Dir.foreach('./test') do |file| 
    next if file == '.' or file == '..' 
    puts "search for /#{file}" 
    res = src_dir_files.bsearch{|s| s.end_with? "/#{file}"} 
    puts "Found :#{res}" 
end 

輸出是:

found ./src 
found ./src/lol 
found ./src/lol/toto 
found ./src/lolilolpouet 
found ./src/lolilolpouet/tutu 
found ./src/lolilolpouet/tutu/tata 
search for /tata 
Found :./src/lolilolpouet/tutu/tata 
search for /toto 
Found : 

託託搜索不會返回結果。 任何想法爲什麼,以及如何解決它?

編輯:如果我用find來替換bsearch,上面的代碼表現得如預期。 任何人都可以向我解釋這兩種方法之間的區別嗎?

我上傳了一個TGZ,如果你想嘗試一下:

http://cl.ly/331J0C2e2D0Y

+0

你似乎已經改變了原來的問題 – bjhaid

回答

1

我就如下操作:

src = Dir["./src/**/*"] 
#=> ["./src/lol", "./src/lol/toto", "./src/lolilolpouet", "./src/lolilolpouet/tutu", "./src/lolilolpouet/tutu/tata"] 
Dir["./test/**/*"].each do |test_file| 
    file = src.find { |x| x.include? test_file.gsub(/.*\//, "") } 
    puts "Found #{file}" 
end 

# >> Found ./src/lolilolpouet/tutu/tata 
# >> Found ./src/lol/toto 
+1

感謝代碼,但...任何想法,爲什麼我的工作不按預期工作?我是否在使用bsearch時誤解了某些內容? – Antzi

+0

@Antzi我也嘗試過'bsearch',無論出於什麼原因都無法正常工作,我不確定我完全理解'bsearch'應該如何工作,而且在過去嘗試使用它時表現得很滑稽,所以我建議使用發現,如果你對「搜索性能」如此熱衷,那麼我會建議你編寫自己的二進制搜索實現 – bjhaid

0

我猜src_dir_files未排序。

+0

這並沒有提供問題的答案。要批評或要求作者澄清,請在其帖子下方留言。 –

+0

@AmarnathBalasubramanian:我不同意。輸入數據未被排序幾乎是「bsearch」失敗的唯一原因。 –

+0

@JörgWMittag排序'src_dir_files'似乎對'bsearch'沒有幫助 – bjhaid

相關問題