我有多个文件,其中包含key = value字符串对。文件之间的键是相同的,但值不同。每个文件可以有1000多个这样的对。
我想将每个文件存储在一个单独的散列映射中,即map<KeyString, ValueString>
,所以如果有五个文件,则会有五个散列图。
为避免在每个散列映射中重复键,是否可以让每个映射引用相同的键?请注意,一旦将键添加到地图中,它就不会被删除。
我考虑将第一个文件作为flyweight模式中的'base',这个基数将是键/值的固有集合。其余剩余的文件将是外部值集,但我不知道如何将值与基本(内部)键相关联而不复制键?
我愿意采用更简单/更好的方法。
答案 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()
。
被叫时,它的作用是:
答案 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}}则有必要。