2012-05-22 5 views
1

문자열이있는 트리 맵을 키로 사용합니다. String 검색에서 키가 시작되는 모든 값을 가져 오려고합니다. 내가 여기서 무엇을해야하는지 생각문자열 키가 패턴으로 시작하는 TreeMap에서 값 가져 오기

는 같은 :

myTreeMap.subMap (search.concat (X1) 사실, search.concat (X2), TRUE);

여기서 X1과 X2는 가능한 한 가장 높고 가능한 문자입니다.

더 좋은 방법이 있습니까? 그렇지 않다면, X1과 X2는 무엇입니까? 사전에

감사합니다.

+2

검색 할 값으로 시작하는 키를 원하십니까? 그래서 검색이 "foo"라면 "foo *"가 정확한지 찾고 있습니까? –

+0

네, 맞습니다. – bluehallu

답변

0

은 기본적으로 당신은 두 번째 경계로 전적으로 다음 접두사가 필요합니다. 이 대답은 오타를 수정하고 원래의 경우 오버 플로우를 처리합니다.

public <T> Map<String, T> subMapWithKeysThatAreSuffixes(String prefix, NavigableMap<String, T> map) { 
    if ("".equals(prefix)) return map; 
    String lastKey = createLexicographicallyNextStringOfTheSameLength(prefix); 
    return map.subMap(prefix, true, lastKey, false); 
} 

String createLexicographicallyNextStringOfTheSameLength(String input) { 
    final int lastCharPosition = input.length()-1; 
    String inputWithoutLastChar = input.substring(0, lastCharPosition); 
    char lastChar = input.charAt(lastCharPosition); 
    char incrementedLastChar = (char) (lastChar + 1); 
    // Handle int/char overflow. This wasn't done above. 
    if (incrementedLastChar == ((char) 0)) return input+incrementedLastChar; 
    return inputWithoutLastChar+incrementedLastChar; 
} 
0

흠. 나는 당신이해야한다고 말하고있다 myTreeMap.subMap(search, true, search2, false)search2는 연결되어 있지 않지만 대신 "증가"입니다. 결국 X2이 문자 일 경우 구현시 search.concat(X2).concat(X2)이 누락 될 수 있습니다.

+0

증가 문자열? 나는 대답에서 길을 잃었습니다. – bluehallu

+0

'String'에서 마지막 문자를 증가시킵니다. 예를 들어, "abc"가 주어지면, "search2"에 "abd"를 사용하십시오. –

+0

예,하지만 어떻게 할 수 있습니까? 숫자가 있다면? – bluehallu

0

문제는 사용자가하려는 부분 키 검색입니다.

myTreeMap.subMap(search.concat(X1), true, search.concat(X2), true); 

의 당신이 몇 가지 키/값 쌍 가정 해 보자 : -> 일부 값 fooBage -

FOOBAR>을 다른 값 barBear -> 값 아이디어 바텐더에서 실행 -> 또 다른 값

이제 fooBar 및 fooBage의 모든 "foo *"를 찾으려고합니다. 키는 단일 토큰으로 취급되며,이 경우에는 문자열입니다. 키를 부분 키로 취급 할 방법이 없습니다. "fooZ"를 통해 "fooA"를 원한다고 말하는 것조차도 fooBar 또는 fooBage를 얻을 수 없습니다.

키 클래스 (FractionalKey라고 부름)를 만들고 equals 메서드를 재정의하면 equals를 "some regex"또는 "전체 또는 단지 첫 번째 파트"등으로 정의 할 수 있습니다. 이 문제는 equals가 true를 반환하면 해시 코드도 동일해야하며 이는 내가 생각하는 규칙을 어기는 것입니다.

나는이 옵션이 유일한 것으로 생각하고, 원하는 것이 아닌 다른 키 목록을 검색한다고 생각합니다.

public <T> Map<String, T> subMapWithKeysThatAreSuffixes(String prefix, NavigableMap<String, T> map) { 
    if ("".equals(prefix)) return map; 
    String lastKey = createLexicographicallyNextStringOfTheSameLenght(prefix); 
    return map.subMap(prefix, true, lastKey, false); 
} 

String createLexicographicallyNextStringOfTheSameLenght(String input) { 
    final int lastCharPosition = input.length()-1; 
    String inputWithoutLastChar = input.substring(0, lastCharPosition); 
    char lastChar = input.charAt(lastCharPosition) ; 
    char incrementedLastChar = (char) (lastChar + 1); 
    return inputWithoutLastChar+incrementedLastChar; 
} 
+0

아니, 스마트 솔루션이 있습니다. 다른 답변보기 –

0

도 원래되고 거부 된 위의 대답에 내 편집, 내가 여기에 게시 것이기 때문에 :