结合Multimaps与功能依赖关系

时间:2014-12-09 14:43:09

标签: java algorithm multimap

给定一个multimap,我需要将这些条目与它们的功能依赖关系结合起来。

我可能误用了术语功能依赖。我的意思是:

如果我有三个multimap条目:

a -> b c d

b -> c e f

g -> f h i

我希望将它们组合为

a -> c e d f

g -> h i

ef转到a,因为b的值为ac, e, f的值为b

hi转到g,因为gh都不是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]}

P.S。

键始终映射到三个值。

2 个答案:

答案 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]}