红宝石中的bsearch和find之间的区别

时间:2014-02-26 01:07:53

标签: ruby bsearch

我正在尝试将目录中的文件与其他目录中的其他文件以及使用ruby的子目录进行匹配。

我尝试使用此文件架构进行小型测试:

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

我的红宝石代码是:

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 :

搜索toto不会返回结果。 知道为什么,以及如何解决它?

编辑:如果我用find替换bsearch,上面的代码就会按预期运行。 任何人都可以向我解释这两种方法之间的区别吗?

如果您想尝试,我上传了一个tgz:

http://cl.ly/331J0C2e2D0Y

2 个答案:

答案 0 :(得分: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 :(得分:0)

我猜测src_dir_files没有排序。