两个哈希映射的一般合并

时间:2011-11-25 23:58:11

标签: java hashmap

在java中,如果我有两个对象A和B,并且两者都包含引用id的类变量,而A也有类变量类型,则B具有类变量位置。我正在尝试构建一个地图,其中键作为类型,值作为位置。目前我通过构建两个单独的映射来实现这一点,一个映射(Map1)将引用id链接到类型,并通过迭代类型A的对象列表构建,另一个映射(Map2)将引用id链接到位置和通过迭代类型B的对象列表来构造。然后通过迭代Map1的keySet并找到引用id的值,将其作为新映射中的键,然后获取值来合并映射。 Map2的位置,并将其用作类型的值。实施如下所示。我的问题是:有没有更有效的方法来做这个算法?这似乎不是最好的实现。对于歧义感到抱歉 - 希望代码能让问题更清晰。

Map<String, String> referenceIdToType = new HashMap<String, String>();
Map<String, String> referenceIdToLocation = new HashMap<String, String>();

for(Info info : infoList) {
     referenceIdToType.put(info.getReferenceId(), info.getType());
}
for(Location loc : locationList) {
     referenceIdToLocation.put(loc.getReferenceId(), loc.getLocation());
}

Map<String, String> typeToLocation = new HashMap<String, String>();
for(String referenceId : referenceIdToType.keySet()) {
    typeToLocation.put(referenceIdToType.get(referenceId), referenceIdToLocation.get(referenceId));
}

3 个答案:

答案 0 :(得分:1)

您可以通过删除其中一个HashMaps来优化它。您只需要为其中一个列表创建一个HashMap。然后通过循环遍历第二个列表来构建最终的HashMap,使用另一个列表的HasMap来获取匹配值。

Map<String, String> referenceIdToLocation = new HashMap<String, String>();

for(Location loc : locationList) {
     referenceIdToLocation.put(loc.getReferenceId(), loc.getLocation());
}

Map<String, String> typeToLocation = new HashMap<String, String>();
for(Info info : infoList) {
    typeToLocation.put(info.getType(), referenceIdToLocation.get(info.getReferenceId()));
}

答案 1 :(得分:0)

  

我的问题是:有更有效的方法来执行此算法吗?

我认为没有更有效的方法来执行该操作。我甚至无法想到最终typeToLocation映射的更好的表示/实现,除非有关键/值的特殊内容允许您使用快捷方式。

(顺便说一句,我不会把你正在进行的操作称为“合并”。从数学的角度来看,它更像是映射的“组合”,尽管它并不严格。对我来说,“合并“地图只是创建他们的条目的联合,这就是我认为你最初的意思......”

答案 2 :(得分:0)

为什么不通过referenceId查找LocationInfo个对象,然后将它们放入HashMap

ArrayList<String> referenceIds = //all reference ids;

public Location getLocationByReferenceId(String referenceId)
{
    for(Location loc : locationList)
    {
        if(loc.getReferenceId().equals(referenceId))
            return loc;
    }
}

public Info getInfoByReferenceId(String referenceId)
{
    for(Info info : infoList)
    {
        if(info.getReferenceId().equals(referenceId))
            return info;
    }
}

然后,您只需创建一个地图并调用getType()getLocation()

Map<String, String> typeToLocation = new HashMap<String, String>();

for(String refID : referenceIds)
{
   Location loc = getLocationByReferenceId(refID);
   Info    info = getInfoByReferenceId(refID);

   typeToLocation.put(info.getType(), loc.getLocation());
}

我知道这不是你想要的,但我希望它有所帮助。