为什么在PatriciaTrie中无法访问`floorEntry`和其他方法?

时间:2015-09-12 13:44:35

标签: java scala reflection apache-commons-collection patricia-trie

在实现ip-lookup结构时,我试图在一个类似于trie的结构中维护一组键,这允许我搜索一个键的“floor”(即,最小键或更小键)给定的密​​钥)。我决定使用Apache Collections 4 PatriciaTrie但遗憾的是,我发现floorEntry及相关方法不是current。我目前的“脏”解决方案是用反射强制它们(在Scala中):

public

有没有干净的方法来拥有相同的功能?为什么这种方法不公开?

1 个答案:

答案 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,则会返回keyString在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毫秒等等。