1

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

我认为我需要在这里做的是:

myTreeMap.subMap(search.concat(X1), true, search.concat(X2), true);

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

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

提前致谢。

4

4 回答 4

0

由于我对上述答案的编辑因过于原创而被拒绝,因此我将在此处发布。这个答案修复了拼写错误并处理了原始没有的 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;
}
于 2013-12-03T23:06:04.793 回答
0

基本上,您需要按字典顺序将 next 前缀作为第二个边界:

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;
}
于 2012-05-24T22:07:21.443 回答
0

问题是您尝试执行的部分关键搜索。

myTreeMap.subMap(search.concat(X1), true, search.concat(X2), true);

假设您有一些键/值对:

fooBar -> 一些值 fooBage -> 一些其他值 barBear -> 用尽价值想法 barTender -> 另一个值

现在您要查找所有“foo*”,在此示例中为 fooBar 和 fooBage。密钥被视为单个标记,在这种情况下恰好是一个字符串。无法将密钥视为部分密钥。即使通过“fooZ”说你想要“fooA”也不会让你得到 fooBar 或 fooBage。

如果您创建键类(我将其称为 FractionalKey)并覆盖 equals 方法,那么您可以将 equals 定义为“某个正则表达式”或“整个事物,或只是第一部分”等。问题与这就是如果equals返回true,那么哈希码也必须相等,这将打破我认为的规则。

我认为这是您唯一的选择,除了在键列表中搜索您想要的键。

于 2012-05-23T16:36:50.493 回答
0

嗯。我会说你应该myTreeMap.subMap(search, true, search2, false)search2没有连接的地方做,而是“增加”。毕竟,如果X2只是一个字符,那么你的实现就会错过search.concat(X2).concat(X2).

于 2012-05-22T23:29:31.747 回答