시작하려면 먼저 요구 사항을 다시 검토하십시오. Character.MAX_VALUE
은 유효한 유니 코드 문자가 아니며 결코 존재하지 않을 U + FFFF입니다. 그래서 당신이 그것을지지 할 필요가있는 충분한 이유를 생각할 수 없습니다.
그러나 그 이유가있는 경우 — 접두어로 시작하는 모든 문자열보다 큰 최소 문자열을 계산하려면 접두사를 "증가"해야합니다. 예를 들어, "city"
을 입력하면 "citz"
이 필요합니다.
/**
* @param allElements - a SortedSet of strings. This set must use the
* natural string ordering; otherwise this method
* may not behave as intended.
* @param prefix
* @return The subset of allElements containing the strings that start
* with prefix.
*/
private static SortedSet<String> getElementsWithPrefix(
final SortedSet<String> allElements, final String prefix) {
final Optional<String> endpoint = incrementPrefix(prefix);
if (endpoint.isPresent()) {
return allElements.subSet(prefix, endpoint.get());
} else {
return allElements.tailSet(prefix);
}
}
가에서 직접보기 :
/**
* @param prefix
* @return The least string that's greater than all strings starting with
* prefix, if one exists. Otherwise, returns Optional.empty().
* (Specifically, returns Optional.empty() if the prefix is the
* empty string, or is just a sequence of Character.MAX_VALUE-s.)
*/
private static Optional<String> incrementPrefix(final String prefix) {
final StringBuilder sb = new StringBuilder(prefix);
// remove any trailing occurrences of Character.MAX_VALUE:
while (sb.length() > 0 && sb.charAt(sb.length() - 1) == Character.MAX_VALUE) {
sb.setLength(sb.length() - 1);
}
// if the prefix is empty, then there's no upper bound:
if (sb.length() == 0) {
return Optional.empty();
}
// otherwise, increment the last character and return the result:
sb.setCharAt(sb.length() - 1, (char) (sb.charAt(sb.length() - 1) + 1));
return Optional.of(sb.toString());
}
그것을 사용하려면, 당신이 아무 것도 반환하지 않는 경우 위의 방법은 문자열을 반환 subSet
및 tailSet
를 사용해야합니다 : 당신은 다음과 같은 것을 할 수 : http://ideone.com/YvO4b3.
cityNames의 유형은 무엇입니까? [Minimal, Complete, Verifiable example] (https://stackoverflow.com/help/mcve)을 게시 할 수 있습니까? – tnas