给定一个multimap,我需要将这些条目与它们的功能依赖关系结合起来。
我可能误用了术语功能依赖。我的意思是:
如果我有三个multimap条目:
a -> b c d
b -> c e f
g -> f h i
我希望将它们组合为
a -> c e d f
g -> h i
e
和f
转到a
,因为b
的值为a
而c, e, f
的值为b
h
和i
转到g
,因为g
和h
都不是a
的值。
f
不会转到a
,因为它显示为a
的值(优先级正在提升)。
以下是我编写的代码,它提供了ConcurrentModificationError
:
Multimap<Integer, Integer> map = TreeMultimap.create();
Multimap<Integer, Integer> map2 = TreeMultimap.create();
map.put(0, 1);
map.put(0, 3);
map.put(0, 4);
map.put(1, 3);
map.put(1, 4);
map.put(1, 6);
map.put(3, 7);
map.put(3, 9);
map.put(3, 10);
map.put(2, 7);
map.put(2, 8);
map.put(2, 9);
System.out.println(map);
for(int i : map.keySet())
{
for(int j : map.get(i))
{
if(map.containsKey(j))
{
Collection<Integer> list = map.get(j);
map2.putAll(i, map.get(j));
map.values().removeAll(list);
}
}
if(!map.values().contains(i))
map2.putAll(i, map.get(i));
}
System.out.println(map2);
输出结果为:
{0=[1, 3, 4], 1=[3, 4, 6], 2=[7, 8, 9], 3=[7, 9, 10]}
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.TreeMap$PrivateEntryIterator.nextEntry(Unknown Source)
at java.util.TreeMap$KeyIterator.next(Unknown Source)
at com.google.common.collect.AbstractMapBasedMultimap$WrappedCollection$WrappedIterator.next(AbstractMapBasedMultimap.java:486)
at test.Test.main(Test.java:68)
但是,我希望它是:
{0=[1, 3, 4], 1=[3, 4, 6], 2=[7, 8, 9], 3=[7, 9, 10]}
{0=[1, 3, 4, 6, 7, 9, 10], 2=[8]}
键始终映射到三个值。
答案 0 :(得分:1)
您无法迭代地图,并同时修改它。修复代码最简单的方法是在输入时创建新地图,而不是修改现有地图。
答案 1 :(得分:0)
我找到了正确的方法。我不知道算法能否更有效率,但这就是我现在所拥有的:
Multimap<Integer, Integer> map = TreeMultimap.create();
Multimap<Integer, Integer> map2 = TreeMultimap.create();
map.put(0, 1);
map.put(0, 3);
map.put(0, 4);
map.put(1, 3);
map.put(1, 4);
map.put(1, 6);
map.put(3, 7);
map.put(3, 9);
map.put(3, 10);
map.put(2, 7);
map.put(2, 8);
map.put(2, 9);
System.out.println(map);
for(int i : map.keySet())
{
for(int j : map.get(i))
if(map.containsKey(j))
map2.putAll(i, map.get(j));
if(!map.values().contains(i))
map2.putAll(i, map.get(i));
}
ArrayList<ArrayList<Integer>> result = new ArrayList<>();
for(int i : map2.keySet())
result.add(new ArrayList<>(map2.get(i)));
Collections.reverse(result);
for(int i=0; i<result.size()-1; i++)
{
Iterator<Integer> it = result.get(i).iterator();
while(it.hasNext())
{
int j = it.next();
if(result.get(i+1).contains(j))
it.remove();
}
}
result.removeAll(Collections.singleton(Collections.EMPTY_LIST));
map.clear();
Collections.reverse(result);
for(int i=0; i<result.size(); i++)
map.putAll(i, result.get(i));
System.out.println(map);
输出:
{0=[1, 3, 4], 1=[3, 4, 6], 2=[7, 8, 9], 3=[7, 9, 10]}
{0=[1, 3, 4, 6, 7, 9, 10], 1=[8]}