Java 在树集中查找以给定前缀开头的字符串

Java 在树集中查找以给定前缀开头的字符串,java,treeset,Java,Treeset,我试图在树集中找到以给定前缀开头的字符串。我发现前面的一个问题也在问同样的问题——但这里给出的答案对我来说并不适用,因为它假设字符串不包含字符.MAX_VALUE,而我的可以 (答案是使用treeSet.subSet(prefix,prefix+Character.MAX_VALUE),它给出prefix(包括)和prefix+Character.MAX_VALUE(排除)之间的所有字符串。),它将出现在所有以前缀开头的字符串中,除了那些以前缀+字符.MAX_值开头的字符串。但是在我的例子中,我

我试图在
树集中找到以给定前缀开头的字符串。我发现前面的一个问题也在问同样的问题——但这里给出的答案对我来说并不适用,因为它假设字符串不包含
字符.MAX_VALUE
,而我的可以

(答案是使用
treeSet.subSet(prefix,prefix+Character.MAX_VALUE)
,它给出
prefix
(包括)和
prefix+Character.MAX_VALUE
(排除)之间的所有字符串。),它将出现在所有以
前缀开头的字符串中,除了那些以
前缀+字符.MAX_值
开头的字符串。但是在我的例子中,我需要找到所有以
前缀开头的字符串,包括那些以
前缀+字符.MAX_值
开头的字符串)


我该怎么做?

首先,我建议重新检查您的需求
Character.MAX_值
是U+FFFF,它不是有效的Unicode字符,并且永远不会是;所以我想不出一个好的理由为什么你需要支持它

但是如果有一个很好的理由来满足这个要求,那么-你需要“增加”你的前缀来计算最小的字符串,它大于所有以你的前缀开始的字符串。例如,给定
“city”
,您需要
“citz”
。您可以按如下方式执行此操作:

/**
 * @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());
}

如果有人在寻找鲁克答案的简短版本,请参见:.

第一个元素实际上是set.floor(前缀),最后一个-必须增加前缀并使用set.floor(下一个前缀)

public NavigableSet subSetWithPrefix(NavigableSet集,字符串前缀){
字符串优先=设置天花板(前缀);
char[]chars=prefix.toCharArray();
如果(字符长度>0)
字符[chars.length-1]=(字符)(字符[chars.length-1]+1);
字符串last=set.floor(新字符串(字符));

if(first==null | | last==null | | last.compareTo(first)cityNames是什么类型的?你能发布一个吗?非常感谢,你我的救星原因是教授的要求,可能是因为对树结构有更深的理解,我不知道当
前缀
为空或以
字符.MAX_VALUE
结尾时会出现这种错误行为;对于它确实支持的情况来说,这是不必要的复杂。(为什么会有人“寻找鲁克答案的简短版本”?)
/**
 * @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);
    }
}
public NavigableSet<String> subSetWithPrefix(NavigableSet<String> set, String prefix) {
    String first = set.ceiling(prefix);
    char[] chars = prefix.toCharArray();
    if(chars.length>0)
        chars[chars.length-1] = (char) (chars[chars.length-1]+1);
    String last = set.floor(new String(chars));
    if(first==null || last==null || last.compareTo(first)<0)
        return new TreeSet<>();
    return set.subSet(first, true, last, true);
}