Java - 指向同一个键的多个哈希映射

时间:2017-08-10 08:26:57

标签: java hashmap

我有多个文件,其中包含key = value字符串对。文件之间的键是相同的,但值不同。每个文件可以有1000多个这样的对。

我想将每个文件存储在一个单独的散列映射中,即map<KeyString, ValueString>,所以如果有五个文件,则会有五个散列图。

为避免在每个散列映射中重复键,是否可以让每个映射引用相同的键?请注意,一旦将键添加到地图中,它就不会被删除。

我考虑将第一个文件作为flyweight模式中的'base',这个基数将是键/值的固有集合。其余剩余的文件将是外部值集,但我不知道如何将值与基本(内部)键相关联而不复制键?

我愿意采用更简单/更好的方法。

4 个答案:

答案 0 :(得分:2)

我可以考虑一种更简单的方法。而不是Map<String, String> Map<String, List<String>MultiMap<String, String>直接guava。{/ p>

如果每个密钥都在每个文件中并且都有值,则可以存储第一个文件的第0个索引,第一个索引的第二个值等。

如果它不起作用,我建议使用Collection<Map<String, String>,以便您能够遍历Map。然后,当您想要为其中一个Map添加值时,请浏览所有keySet,如果其中一个包含该密钥,则只需放入从此keySet返回的对象。< / p>

其他解决方案是拥有已经放置的HashSet个密钥。这会更有效率。

答案 1 :(得分:1)

首先,我没有看到存储String键的多个实例的问题。 5 HashMap s * 1000键是一个非常小的数字,你不应该有内存问题。

也就是说,如果您仍想避免重复String,则可以创建第一个HashMap,然后为其他HashMap创建完全相同的密钥。< / p>

例如,假设map1是第一个HashMap,并且已经填充了第一个文件的内容。

你可以写这样的东西来填充第二个HashMap

for (String key : map1.keySet()) {
    map2.put (key, someValue);
} 

当然,您必须为第一张地图的每个key找到第二张地图的相应值。如果密钥未在输入文件中以相同顺序存储,则可能需要一些初步分类步骤。

答案 2 :(得分:1)

阅读完钥匙后,您可以使用String.intern()。 被叫时,它的作用是:

  • 如果String已经不存在,则将其添加到内部池中;
  • 如果已经存在,则从池中返回等效的字符串。

String#intern Javadoc

答案 3 :(得分:0)

也许您可以按住Integers将您的密钥映射到唯一的Integer,并将这些class KeySharedMap<K,V> { // The next key to use. Using Atomics for the auto-increment. static final AtomicInteger next = new AtomicInteger(0); // Static mapping of keys to unique Integers. static final ConcurrentMap<Object,Integer> keys = new ConcurrentHashMap<>(); // The map indexed by Integer from the `keys`. Map<Integer, V> map = new HashMap<>(); public V get(Object key) { return map.get(keys.get(key)); } public V put(Object key, V value) { // Associate a unique integer for each unique key. keys.computeIfAbsent(key,x -> next.getAndIncrement()); // Put it in my map. return map.put(keys.get(key),value); } } 用于地图的密钥?

类似的东西:

K

是的,我知道此处未使用Map<K,V>,但我怀疑如果您希望实施{{1}}则有必要。