有效的方式来更新" HashMap中的条目?

时间:2017-02-03 09:09:25

标签: java hashmap

我想知道是否有更有效的方法来执行此操作:

private void updateRelations(String relation, Gene gen) {
        if (relations.containsKey(gen)) {
           HashSet<String> relationDat= relations.get(gen);
           relationDat.add(relation);
           relations.put(gen, relationDat);
        }
        else {
            HashSet<String> relationDat = new HashSet<>();
            relationDat.add(relation);
            relations.put(gen, relationDat);
        }
    }


Gene和Relation都是对象。所以我做的是检查是否已经存在Gene对象(具有相同的基因ID),如果是这种情况,我想将新发现的关系添加为值。如果不是,我只创建一个新的键值对。有没有更有效的方法来做到这一点?

4 个答案:

答案 0 :(得分:5)

在Java 8中,您可以使用computeIfAbsent - 如果Map中没有密钥,它将添加与给定密钥关联的值。

computeIfAbsent会返回the current (existing or computed) value associated with the specified key,因此会返回现有的HashSet或新创建的HashSet,您可以添加新元素:

relations.computeIfAbsent(gen, k -> new HashSet<String>()).add(relation);

答案 1 :(得分:0)

我重构了你的代码。检查一下

private void updateRelations(String relation, Gene gen) {
    HashSet<String> relationDat;
    if (relations.containsKey(gen)) {
        relationDat= relations.get(gen);
    } else {    
        relationDat = new HashSet<>();
    }
     relationDat.add(relation);
     relations.put(gen, relationDat);
    }

您可以使用三元运算符代替if else来进一步简化它。

private void updateRelations(String relation, Gene gen) {
        HashSet<String> relationDat = (relations.containsKey(gen)) ?
         relations.get(gen) : new HashSet<>();
         relationDat.add(relation);
         relations.put(gen, relationDat);
 }

答案 2 :(得分:0)

你的代码很好。但是,您不应该包含第5行: relations.put(gen, relationDat); 该代码不是必需的,因为relationDat是一个目标

答案 3 :(得分:0)

您尝试执行的操作完全由来自Google Multimap库的名为guava's的数据结构处理。

您可以将Multimap视为Map<K, List<V>>Map<K, Set<V>>。 Multimap是将密钥与任意多个值相关联的一般方法。

例如:

private Multimap<Gen, String> relations = HashMultimap.create();

private void updateRelations(String relation, Gene gen) {
    relations.put(gen, relation);
}

以下是documentation