문제는 사용자가하려는 부분 키 검색입니다.
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;
}
검색 할 값으로 시작하는 키를 원하십니까? 그래서 검색이 "foo"라면 "foo *"가 정확한지 찾고 있습니까? –
네, 맞습니다. – bluehallu