2015-04-16 115 views
0

我有一个2个属性的列表,即实体和应用程序。几个实体可以是一个应用程序的一部分。现在,我想将具有相同应用程序的所有实体映射到一个应用程序列表。为此,我宣布HashMap <String, List <String>>2个属性的映射

在迭代实体列表时,我希望将它们逐个添加到应用程序列表中。 在C++中,我可以使用一个映射,其中m [appName]会给出链接列表头并使用我可以添加到现有列表的映射。在hashmap中,我需要放入(key,value)对,但是如何将其添加到应用程序的实体的现有列表中?

+0

请分享当前如何做。你有尝试过什么吗? – aProgrammer

+0

现在我迭代多次,选择一个appName,然后在该迭代中,我将具有此appName的所有实体添加到列表中。最后在迭代结束时,我将这个创建的列表添加到HashMap中。但是这是多余的,因为我运行循环n^2次。 –

+0

我需要类似m [appName]的东西,这将使我可以将该实体添加到具有相同appName的实体的现有列表中,或者在该appName下创建具有该实体的新列表。这将使我能够运行循环n次,其中我可以只写:m [appName] .add(current_entity_name) –

回答

0

从我的理解它会像,我用Set代替List到一个应用程序中执行条目的独特性

public class MapAdder { 
    private Map<String, Set<String>> app2entryMap = new HashMap<>(); 

    ... 

    public boolean addMapping(final String app, final String entry) { 
     Set<String> entries = app2entryMap.get(app); 

     if (entries == null) { 
      entries = new HashSet<String>(); 
      app2entryMap.put(app, entries); 
     } 

     return entries.add(entry); 
    } 
} 

注意。如果它不是你的情况/你不需要它 - List是好的,可能工作更快。

还要注意的是应该有一个正确的hashCode()/equals()实施放入HashSet真正的对象等见http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#hashCode()

0

事实证明我使用HashMap中的get方法为我的目的。我这样使用它:

m.get(key).add(value) 

其中在'关键'只是appName和值是实体ID。唯一需要注意的是,对于第一次插入,我必须做一个空检查,如果我发现'get'返回null,我创建了一个我自己的List并插入它。