Java 为什么PatriciaTrie中无法访问“FloorRentry”和其他方法?

Java 为什么PatriciaTrie中无法访问“FloorRentry”和其他方法?,java,scala,reflection,apache-commons-collection,patricia-trie,Java,Scala,Reflection,Apache Commons Collection,Patricia Trie,在实现ip查找结构时,我试图在类似trie的结构中维护一组密钥,该结构允许我搜索密钥的“楼层”(即,小于或等于给定密钥的最大密钥)。我决定使用ApacheCollections4,但遗憾的是,我发现它和相关的方法不是公开的。我当前的“脏”解决方案是使用反射强制它们(在Scala中): 有没有什么干净的方法可以实现相同的功能?为什么这些方法不公开?为什么这些方法不公开,我不知道。(可能是因为您可以使用通用MapAPI实现您想要的功能) 以下是满足您要求的方法: PatriciaTrie<St

在实现ip查找结构时,我试图在类似trie的结构中维护一组密钥,该结构允许我搜索密钥的“楼层”(即,小于或等于给定密钥的最大密钥)。我决定使用ApacheCollections4,但遗憾的是,我发现它和相关的方法不是公开的。我当前的“脏”解决方案是使用反射强制它们(在Scala中):


有没有什么干净的方法可以实现相同的功能?为什么这些方法不公开?

为什么这些方法不公开,我不知道。(可能是因为您可以使用通用
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
现在一切正常,因为
\uefff
是最高的unicode字符。实际上,搜索
key+“\uefff”
,无论
key
是什么,如果它属于trie,则总是返回
key
,如果
key
不在trie中,则总是返回
key
之前的元素


现在,这个技巧适用于
String
键,但也可以扩展到其他类型。i、 e.对于
Integer
键,您可以搜索
key+1
,对于
Date
键,您可以添加1毫秒,等等。

如果我理解正确,
trie.headMap(k).lastKey()k
,则code>不会返回,因为
headMap
的文档说它“返回一个该地图部分的视图,该部分的键严格小于toKey”。
PatriciaTrie<String> trie = new PatriciaTrie<>();
trie.put("a", "a");
trie.put("b", "b");
trie.put("d", "d");

String floorKey = trie.headMap("d").lastKey(); // d
String cFloorKey = trie.headMap("c" + "\uefff").lastKey(); // b

String dFloorKey = trie.headMap("d" + "\uefff").lastKey(); // d