我想知道是否有更有效的方法来执行此操作:
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),如果是这种情况,我想将新发现的关系添加为值。如果不是,我只创建一个新的键值对。有没有更有效的方法来做到这一点?
答案 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);
}