Java 获取树映射中字符串键以模式开头的值

Java 获取树映射中字符串键以模式开头的值,java,string,treemap,Java,String,Treemap,我有一个以字符串为键的树形图。我想获取所有键以字符串搜索开始的值 我想我需要做的是: myTreeMap.subspsearch.concatX1,true,search.concatX2,true 其中X1和X2是可能的最高和最低字符 有更好的方法吗?如果不是,X1和X2是什么 提前谢谢。嗯。我想说您应该执行myTreeMap.subspsearch,true,search2,false,其中search2不是串联的,而是递增的。毕竟,如果X2只是一个字符,那么您的实现将错过search.co

我有一个以字符串为键的树形图。我想获取所有键以字符串搜索开始的值

我想我需要做的是:

myTreeMap.subspsearch.concatX1,true,search.concatX2,true

其中X1和X2是可能的最高和最低字符

有更好的方法吗?如果不是,X1和X2是什么


提前谢谢。

嗯。我想说您应该执行myTreeMap.subspsearch,true,search2,false,其中search2不是串联的,而是递增的。毕竟,如果X2只是一个字符,那么您的实现将错过search.concatX2.concatX2。

问题在于您试图执行的部分键搜索

myTreeMap.subMap(search.concat(X1), true, search.concat(X2), true);
假设您有一些键/值对:

fooBar->Some value fooBage->其他一些价值 barBear->价值理念枯竭 调酒师->另一种价值观

现在您需要查找所有foo*,在本例中是fooBar和fooBage。密钥被视为单个令牌,在本例中,该令牌恰好是一个字符串。无法将密钥视为部分密钥。即使说你想通过fooZ得到fooA,也不能得到fooBar或fooBage

如果你创建一个key类,我称之为分馏键,并重写equals方法,那么你可以将equals定义为某个正则表达式,或者整个函数,或者只是第一部分,等等。问题是如果equals返回true,那么hashcode也必须相等,我认为这会打破这个规则


我认为这是您唯一的选择,然后在键列表中搜索所需的键。

基本上,您需要以词典中的下一个前缀作为第二个边界:

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

由于我对上述答案的编辑太原创而被拒绝,我将在这里发布。这个答案修复了打字错误,并处理了原始版本没有的int溢出

public <T> Map<String, T> subMapWithKeysThatAreSuffixes(String prefix, NavigableMap<String, T> map) {
    if ("".equals(prefix)) return map;
    String lastKey = createLexicographicallyNextStringOfTheSameLength(prefix);
    return map.subMap(prefix, true, lastKey, false);
}

String createLexicographicallyNextStringOfTheSameLength(String input) {
    final int lastCharPosition = input.length()-1;
    String inputWithoutLastChar = input.substring(0, lastCharPosition);
    char lastChar = input.charAt(lastCharPosition);
    char incrementedLastChar = (char) (lastChar + 1);
    // Handle int/char overflow.  This wasn't done above.
    if (incrementedLastChar == ((char) 0)) return input+incrementedLastChar;
    return inputWithoutLastChar+incrementedLastChar;
}

那么您想要以搜索中的值开头的键?所以,如果搜索是foo,那么您正在寻找foo*正确?增量字符串?我想我在你的回答中迷路了。增加字符串中的最后一个字符。例如,给定abc,使用abd进行搜索2。是的,但是你怎么做呢?如果有数字呢?字符ch+1将返回字符ch之后的下一个字符。不,有智能解决方案。看到其他答案了吗