我想编写一个代码,将(List<Integer> , List<Triple>)
作为(键,值)放入HashMap
:Map <List<Integer> , List<Triples>> ptList = new HashMap<>();
三元组是三个整数值。对于像(1,3)这样的模式,我有一个类似于(0,0,1)的位置列表我想检查模式是否在ptList
中,如果它不存在那么我把它放入密钥部分和三重进入价值部分。
pattern =new ArrayList<>();
pattern.add(first);
pattern.add(second);
sequenceID = sequence.getId();
//Generate triples with sequence ID and start with end
if (!ptList.containsKey(pattern)) {
location=new ArrayList<>();
Triples triples = new Triples(sequenceID, i, j);
location.add(triples);
}
到现在为止没有任何问题,但是当一个新模式出现并且它在ptList
中时,我想在不更改关键部分的情况下向地图的值部分添加新的三元组。
例如[[1,3]= (0,0,1)]
存储在hashMap中,然后另一个[1,3]
发生了不同的三元组(1,3,4)
我要将(1,3,4)
添加到上一个列表中,例如[1,3]=[(0,0,1),(1,3,4)]
这就是我所知道的模式[1,3]
在两个不同的位置发生过两次。我怎样才能做到这一点?将三元组添加到List<Triples>
并保留旧位置的其他部分是什么?
答案 0 :(得分:0)
您可以检查地图中是否存在密钥(1,3)
,否则为put(key, new ArrayList with triple)
,get(key).add(triple)
或使用第三部分lib,例如番石榴Multimap
简化你的逻辑。
毕竟,我觉得可以有改进设计的空间。但我不确定,因为我不确切地知道你的要求。
答案 1 :(得分:0)
可以是这样的
if (!ptList.containsKey(pattern)) {
location=new ArrayList<>();
Triples triples = new Triples(sequenceID, i, j);
location.add(triples);
}else{
location=new ArrayList<>();
Triples triples = new Triples(sequenceID, i, j);
ptList.get(pattern).add(triples);
}
答案 2 :(得分:0)
您正在寻找MultiMap,您可以使用现有的实施,例如Apache Commons Collections MultiValueMap decorator或Guava Multimap。请注意,签名从Map <List<Integer> , List<Triple>>
更改为Map <List<Integer> , Triple>
。
或者,你可以像其他人发布的那样自己做。
答案 3 :(得分:0)
您不应该对哈希映射数据结构中的键使用List。列表的内容可能会更改,然后您的地图将处于无效状态。
public void store(Collection<Integer> key, Collection<Triple> value) {
Integer rank = rank(key);
put(rank,value);
}
public Collection<Triple> retrieve(Collection<Integer> key) {
Integer rank = rank(key);
return storage.get(rank);
}
private void put(Integer rank, Collection<Triple> value) {
if(!storage.contains(rank)) {
storage.put(rank,new ArrayList<>());
}
storage.get(rank).add(value)
}
功能等级应该创建一个能够识别列表的值。
答案 4 :(得分:0)
由于您的模式大小是动态的,我建议您创建自己的对象来表示此模式。这样它就可以被包装起来,你可以避免使用列表对象作为键。然后使用Guava's ArrayListMultimap。
ArrayListMultimap<Pattern, Triple> myMap = ArrayListMultumap.create();
您可以简单地为特定密钥对设置值。这也接受重复的值。如果您不想这样,请使用HashMultimap。