2014-02-26 6 views
0

다른 디렉토리의 다른 파일과 하위 디렉토리에있는 파일을 루비를 사용하여 일치 시키려고합니다.ruby에서 bsearch와 find의 차이점

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 : 

검색 결과를 반환하지 않습니다. 이유가 무엇이며 어떻게 고칠 수 있습니까?

편집 : 위의 코드는 bsearch를 find로 바꾸면 의도 한대로 동작합니다. 저에게이 두 가지 방법의 차이점을 설명 할 수 있습니까?

나는 당신이 그것을 시도하려는 경우 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