【问题标题】:How to iterate a synchronized treeMap?如何迭代同步的treeMap?
【发布时间】:2011-09-26 21:01:12
【问题描述】:

目前有这个实现:

static Map s_AvailableGameTables = Collections.synchronizedMap(new TreeMap<Integer,Table>());   

如何像数组一样从头到尾遍历它的所有内容?

谢谢

【问题讨论】:

    标签: java iterator treemap


    【解决方案1】:

    假设声明是

    static Map<Integer,Table> s_AvailableGameTables = Collections.synchronizedMap(new TreeMap<Integer,Table>());
    

    (不仅仅是Map

    以下将遍历所有键/值对:

    for (Map.Entry<Integer,Table> e : s_AvailableGameTables.entrySet())
    {
        int key = e.getKey();
        Table tbl = e.getValue();
    }
    

    【讨论】:

    • 谢谢,但是,我的声明和你的有什么区别,我的意思是它在我的程序中发生了什么变化?
    • 顺便说一句,仅以这种方式处理此声明:for(Map.Entry currentTable: ServerMain.s_AvailableGameTables.entrySet())
    • 如果s_AvailableGameTables 只是一个未参数化的Map,那么您不能按原样编写代码以进行迭代。编译器将假定Map&lt;?,?&gt; 为类型,然后entrySet() 方法返回值将与for 语句中的声明不兼容。你可以通过强制转换来解决这个问题,但这就是泛型应该消除的。
    【解决方案2】:

    如果要遍历条目(映射中的键值对):

    for (Map.Entry<Integer, Table> entry : s_AvailableGameTables.entrySet()) {
        System.out.println("key = " + entry.getKey() + ", value = " + entry.getValue());
    }
    

    【讨论】:

    • 在我要求给出编译错误之前做了同样的事情:不兼容的类型
    • 当然,您不能使用原始类型Map 来声明变量s_AvailableGameTables,而必须使用类型参数声明它:static Map&lt;Integer, Table&gt; s_AvailableGameTables,正如 Jim 在他的回答中所说。见tutorial about generics
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-07
    • 2013-03-04
    • 1970-01-01
    • 2014-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多