如何在java中的HashMap中添加整数列表和三元组列表?

时间:2014-08-13 11:55:20

标签: java design-patterns hashmap

我想编写一个代码,将(List<Integer> , List<Triple>)作为(键,值)放入HashMapMap <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>并保留旧位置的其他部分是什么?

5 个答案:

答案 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 decoratorGuava 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