2017-02-24 55 views
0

所以我认为我可以使用HashMap,但它不起作用,因为第一个键不会是唯一的 - 数据集中独一无二的是密钥1和密钥2的组合。需要一些像<key(不唯一)<key, double>>的ds - 不确定要使用什么

我想过将密钥串联成一个字符串来强制唯一性,我认为这应该起作用,但我想确认是否存在“以任何其他方式。需要明确的是,我所期待的一种数据结构,我能...

  1. 查找第一个关键
  2. 查找第二个关键
  3. 访问存储双

这在嵌套的HashMap中工作,但由于第一个键不会是唯一的,所以它会在新的第二个键上更新,在下一个迭代中双键更新。

从搜索中,似乎有一个建议是从Apache的库中使用Multimap,但我不想在访问第一个键时返回一个列表。我最终只想通过访问第一个键然后第二个键来获得双倍。

有什么建议吗?或者我应该试着让串联工作?

示例代码

if(map.get(first[1]) != null && 
    map.get(first[1]).get(second[1]) != null) { 

    HashMap<String, Double> inner = map.get(first[1]); 
    inner.put(second[1], inner.get(second[1]) + 1.0); 

} else { 

    map.put(first[1], new HashMap<>()); 
    map.get(first[1]).put(second[1], 1.0); 
} 

的,检查是不是确有必要 - 应该只是第二个条件

+0

你说的是双倍的,但是那张图保存了整数,并且存在一些问题。您将第一个键(用于外部映射)放入内部映射中,并且如果外部映射已经具有一个,则插入一个新的HashMap,因为内部映射没有第二个键,因此失去了所有先前的信息。 –

+0

对不起,这些都是拼写错误。双/整数,或者没问题。最终,只是试图更新和访问值。第一[1] inner.put应该肯定是第二[1]。 – cpd1

+0

还有一些你没有提到的东西。看起来你并不是想插入一个特定的值,而是增加一个计数器? –

回答

0

你不想多重映射。你的第一个直觉是正确的,你可以做到这一点Map<FirstKey, Map<SecondKey, Integer>>。但要插入它,您必须考虑FirstKey的内部映射可能已经创建或未创建的可能性。

根据您的修改,我想你想计数第二钥匙已经插入到地图的次数,而不是特定的值与它相关联。我已经重写了这个答案,将其考虑在内。

​​

如果你想使用双,而不是整数这是一个简单的变化,但整数更自然,如果我们只是计算的出现。

+0

谢谢大卫!是的,我注意到我需要考虑一个新的HashMap。但如果第一把钥匙不是唯一的,这不会是一个问题吗?就像稍后有另一个“富”,但第二个关键是“动物园”。我会失去“富/酒吧” – cpd1

+0

@ cpd1不,你不会。外部地图将包含“foo”的地图,其中将包含两个键“bar”和“zoo”。 –

+0

好的,我会再看看我的代码。当我重复了这些变化之后,我看到关键字被新值所取代。 – cpd1

相关问题