Map <Object,Collection <Object >>有什么问题?

Eur*_*Iam 1 java map multimap data-structures

我正在尝试在Java中构建一个数据结构,我将插入大约200,000个字符串键,每个键的"平均值"为1000个整数Map<String, Arraylist<Integer>>.该地图最终将拥有大约2亿的价值.

问题是插入时,我必须首先检查键是否存在于映射中,如果为true,则获取存储在临时集合中的所有值,然后将新整数添加到集合中并将它们放回映射,或实例化带有新整数的新集合.

当我到达集合包含大约50000个整数的点时,这是非常慢的.我通常从堆空间错误中得到一个java.

有没有办法摆脱获取过程?在这里我只检查为重点的存在,然后立即值类似豪华添加到已有的集合,堆栈,尤其是因为地图是在内存中,或者是什么使++用C Java和C之间的差异,其中++我可以使用指针受益吗?

保持这样一个事实,我不喜欢通过使用像multimaps这样的东西来增加地图的大小,因为结构看起来几乎是直截了当的.

提前谢谢了.

Bob*_*har 5

如果您的代码实际上正在执行您的问题所暗示的内容,那么您的工作就太难了 一旦你的Key与ArrayList相关联.只需将ArrayList从地图中取出,然后将新整数添加到该列表中.你不需要"放回去".只需更改List即可引用List.

    Map<String, ArrayList<Integer>> m = new HashMap<String, ArrayList<Integer>>();
    for ( int i = 0; i < 5; i++ ) {
        String key = ( i % 2 == 0 ) ? "Bob" : "Robert";
        ArrayList<Integer> l = m.get( key );
        if ( l == null ) {
            l = new ArrayList<Integer>();
            m.put( key, l );
        }
        l.add( i );
    }
    System.out.println( "m is " + m );
Run Code Online (Sandbox Code Playgroud)

在我看来,Guava Multimap是解决这个问题的更好的解决方案:http: //guava-libraries.googlecode.com/svn/tags/release03/javadoc/com/google/common/collect/Multimap.html