0

我使用 mapDB 来存储插入到地图中的数据。我按照 mapDB-Site 上的说明进行操作,能够设置数据库并用值填充它。但是我的问题就在这里,我将数据插入到地图中,然后调用数据库类将地图插入到数据库中。然后将当前映射添加到数据库中,但会自动覆盖先前的条目,因此条目数始终为 1。

这是我的代码:

    for(Element objects : objectInstanceList) 
                    {   

                    mapID = objects.getName().toString();
                    List<Element> listObjects1 = objects.getChildren();
                    Multimap<String, Values> mm = HashMultimap.create();

                    for(Element objectClasses : listObjects1 )
                      {     
                            List<Element> listObjects2 = objectClasses.getChildren();   

                            for(Element objectAttributes : listObjects2)
                                {
                                    String name = objectAttributes.getAttributeValue("name");
                                    String type = objectAttributes.getAttributeValue("type");
                                    String value = objectAttributes.getAttributeValue("value"); 
                                    Values v = new Values(name, type, value);
                                    mm.put(objectClasses.getName(), v);                     
                                }

                      }                         
                        DataBase.putHW(mapID, mm);
                        System.out.println(mm);

                    }

就像我说的那样,我用一些值和 Method Database.putHW 填充 Multimap mm,它看起来像这样(在 mapDB 页面的示例中创建)。

public class DataBase {

static DB dbHW = DBMaker.newMemoryDB().make();
static NavigableSet<Fun.Tuple2<String, Multimap<String,Values>>> multimapHW 
= dbHW.getTreeSet("Applications");

public static void putHW(String mapID, Multimap<String,Values> dbMap) {

multimapHW = dbHW.createTreeSet("Delta").serializer(BTreeKeySerializer.TUPLE2).make();
multimapHW.add(Fun.t2(mapID, dbMap)); // Fun means functional, its the Function to add values in the map    
   }
}

那么为什么数据库中的 multimapHW 只包含 1 个条目,而不是许多条目?

4

1 回答 1

4

MapDB 要求键和值是不可变的。这使得使用集合作为键/值非常有问题。

在排序集中使用Multimap<String,Values>是完全错误的,因为 MapDB 将它传递给可能失败的比较器。

对于您的使用,我会推荐 TreeSet 并将多图拆分为三元组:

static NavigableSet<Fun.Tuple3<String, String,Values>> multimapHW =      
      dbHW.createTreeSet("Applications")
          .serializer(BTreeKeySerializer.TUPLE3)
          .makeOrGet();

它使用 TUPLE3 序列化程序,确保有效的空间使用。Bind类具有静态方法,允许在给定主键的第二级和第三级查找键。一些例子在这里:

https://github.com/jankotek/MapDB/blob/master/src/test/java/examples/MultiMap.java

于 2013-10-03T09:47:39.613 回答