我有一个以字符串为键的树形图。我想获取其键以字符串搜索开头的所有值。
我认为我需要在这里做的是:
myTreeMap.subMap(search.concat(X1), true, search.concat(X2), true);
其中 X1 和 X2 是可能的最高和最低字符。
有更好的方法吗?如果不是,X1 和 X2 是什么?
提前致谢。
由于我对上述答案的编辑因过于原创而被拒绝,因此我将在此处发布。这个答案修复了拼写错误并处理了原始没有的 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;
}
基本上,您需要按字典顺序将 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;
}
问题是您尝试执行的部分关键搜索。
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,那么哈希码也必须相等,这将打破我认为的规则。
我认为这是您唯一的选择,除了在键列表中搜索您想要的键。
嗯。我会说你应该myTreeMap.subMap(search, true, search2, false)
在search2
没有连接的地方做,而是“增加”。毕竟,如果X2
只是一个字符,那么你的实现就会错过search.concat(X2).concat(X2)
.