Java MapDB-子映射行为

Java MapDB-子映射行为,java,mapdb,Java,Mapdb,我有一个关于使用MapDB的问题,特别是关于查询submap的问题。我将从官方示例中获取代码片段。这个例子很容易理解。出于测试目的,我互换了关键部件“Town”和“Street”,并以相同的方式调整了submap调用。不幸的是,现在map不受submap调用的限制。而是返回整个映射(200个条目)。以下是经过调整的代码片段(来自上述示例) //初始化映射 用于(最终字符串城镇:城镇){ 用于(最终字符串街道:街道){ for(最终int houseNum:houseNums){ 最终Fun.Tu

我有一个关于使用MapDB的问题,特别是关于查询submap的问题。我将从官方示例中获取代码片段。这个例子很容易理解。出于测试目的,我互换了关键部件“Town”和“Street”,并以相同的方式调整了
submap
调用。不幸的是,现在map不受
submap
调用的限制。而是返回整个映射(200个条目)。以下是经过调整的代码片段(来自上述示例)

//初始化映射
用于(最终字符串城镇:城镇){
用于(最终字符串街道:街道){
for(最终int houseNum:houseNums){
最终Fun.Tuple3地址=Fun.t3(街道、城镇、,
豪斯纳姆);
最终国际贸易收入=r.nextInt(50000);
地图放置(地址、收入);
}
}
}
...
最终地图housesInCong=Map.subMap(
Fun.t3(空,“聪”,空),Fun.t3(Fun.HI,“聪”,Fun.HI));
//housesInCong.size()=200(应为40)
System.out.println(“有“+housesInCong.size()+”houses in Cong”);
有人能给我解释一下为什么会发生这种情况以及如何避免这种情况吗?我的项目中有一个类似的用例


提前感谢并向您致意:)

我最近在为二维平铺中的地理对象编制索引时遇到了类似的问题。我不得不浏览MapDB源代码并做一些实验来了解发生了什么

MapDB存储对象时,可以很容易地按其自然顺序对对象(或对象的子范围)进行迭代。在迭代值时不能更改顺序,而是在插入对象时要考虑的顺序。它会影响存储在(a)中的结构的布局

MapDB中包含的元组类具有。也就是说,它们的顺序就像字典中的单词一样:比较它们的第一个元素,看哪个元组比另一个元组大。如果前两个元素相等,我们将继续第二个元素,然后是第三个元素,从而打破僵局。你也可以说它们的行为就像一个位置数字系统,所有你比较的数字都有相同的位数

作为一个例子,让我们看一个例子,其中元组中的所有元素都是一位整数。我们首先插入三个一位数整数的所有可能组合。如果我们这样过滤:

map.subMap(Fun.t3(2, null, null), Fun.t3(4, Fun.HI, Fun.HI));
我们将迭代元组(2,0,0),(2,0,1)(2,0,2)。。。(3,9,9). 现在,正如在您的示例中一样,我们将submap调用更改为使用以下边界元组:

map.subMap(Fun.t3(null, 2, null), Fun.t3(Fun.HI, 4, Fun.HI));
这里我们将迭代元组(0,2,0),(0,2,1)(0,2,2)。。。(9,3,9). 排序是一维的,第一个元素比第二个元素更重要

在我们的例子中,我们真正想要的是:对于第一个元素的每个值,拉出第二个元素连续变化的子映射。这涉及到每次第一个元素发生变化时在树内跳跃——这不是一个长的连续迭代。我发现表达这一点的最好方法是将subMap调用封装在for循环中,并“手动”改变高阶元素:

for(int x=minX;x
map.subMap(Fun.t3(null, 2, null), Fun.t3(Fun.HI, 4, Fun.HI));
for (int x = minX; x <= maxX; x++) {
    SortedSet<Tuple3<Integer, Integer, Integer>> xSubset = set.subSet(
        new Tuple3(x, minY, null  ), true, // inclusive lower bound, null tests lower than anything
        new Tuple3(x, maxY, Fun.HI), true  // inclusive upper bound, HI tests higher than anything
    );
    for (Tuple3<Integer, Integer, Long> item : xSubset) {
        int x = item.a;
        int y = item.b;
        int z = item.c;
        // ...
    }
}