2017-05-24 11 views
0

주어진 접두어로 시작하는 TreeSet<String>의 문자열을 찾으려고합니다. 나는 같은 질문을하는 이전 질문을 찾았습니다. — Searching for a record in a TreeSet on the fly — 그러나 문자열에 Character.MAX_VALUE이없고 광산이 포함되지 않는다고 가정하기 때문에 주어진 답은 저에게 맞지 않습니다. 주어진 접두사로 시작하는 TreeSet의 문자열 찾기

은 (대답은 prefix prefix prefix + Character.MAX_VALUE로 시작하는 것과 제외로 시작하는 모든 문자열에 나오는하는) (포함) 및 prefix + Character.MAX_VALUE (전용. 사이 그러나 모든 문자열을 제공하는 treeSet.subSet(prefix, prefix + Character.MAX_VALUE)를 사용하는이 내 경우 나는 prefix + Character.MAX_VALUE로 시작하는 것을 포함 prefix로 시작 모든 문자열을 찾을 필요가있다.)

내가 어떻게 할 수 있습니까?

+0

cityNames의 유형은 무엇입니까? [Minimal, Complete, Verifiable example] (https://stackoverflow.com/help/mcve)을 게시 할 수 있습니까? – tnas

답변

0

시작하려면 먼저 요구 사항을 다시 검토하십시오. 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()); 
} 

그것을 사용하려면, 당신이 아무 것도 반환하지 않는 경우 위의 방법은 문자열을 반환 subSettailSet를 사용해야합니다 : 당신은 다음과 같은 것을 할 수 : http://ideone.com/YvO4b3.

+0

고마워, 내 구세주 – Deploymental

+0

이유는 교수님의 요구 사항입니다, 나무 구조의 깊은 understending 수 있습니다, 나도 몰라요 – Deploymental