在实现ip-lookup结构时,我试图在一个类似于trie的结构中维护一组键,这允许我搜索一个键的“floor”(即,最小键或更小键)给定的密钥)。我决定使用Apache Collections 4 PatriciaTrie但遗憾的是,我发现floorEntry及相关方法不是current
。我目前的“脏”解决方案是用反射强制它们(在Scala中):
public
有没有干净的方法来拥有相同的功能?为什么这种方法不公开?
答案 0 :(得分:1)
为什么这些方法不公开,我不知道。 (也许是因为你可以用普通的Map
API实现你想要的目标。)
这是满足您要求的一种方式:
PatriciaTrie<String> trie = new PatriciaTrie<>();
trie.put("a", "a");
trie.put("b", "b");
trie.put("d", "d");
String floorKey = trie.headMap("d").lastKey(); // d
根据文档,这非常有效,因为它取决于trie中最大键的位数。
编辑:根据@ kaktusito的评论,上面的代码有一个边界问题:headMap()
返回地图的视图,其键严格低于给定的密钥。这意味着,即对于上面的示例,trie.headMap("b").lastKey()
将返回"a"
,而不是"b"
(根据需要)。
为了解决此边界问题,您可以使用以下技巧:
String cFloorKey = trie.headMap("c" + "\uefff").lastKey(); // b
String dFloorKey = trie.headMap("d" + "\uefff").lastKey(); // d
现在一切都按预期工作,因为\uefff
是最高的unicode角色。实际上,搜索key + "\uefff"
,无论key
是什么,如果它属于trie,则会始终返回key
,如果属于key
,则会返回key
,String
在trie中不存在。
现在,这个技巧适用于Integer
个键,但也可以扩展到其他类型。即,对于key + 1
键,您可以搜索Date
,对于module.exports = function (grunt) {
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
htmlhint: {
build: {
options: {
'tag-pair': true,
'tagname-lowercase': true,
'attr-lowercase': true,
'attr-value-double-quotes': true,
'doctype-first': true,
'spec-char-escape': true,
'id-unique': true,
'head-script-disabled': true,
'style-disabled': true
},
src: ['index.html']
}
},
watch: {
html: {
files: ['index.html'],
tasks: ['htmlhint']
}
}
});
require("matchdep").filterDev("grunt-").forEach(grunt.loadNpmTasks);
grunt.registerTask('default', ['watch']);
};
键,您可以添加1毫秒等等。