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);
}