如何使用int索引从TreeMap访问项目?

时间:2014-05-18 18:34:51

标签: java treemap

我有一个像这个私有TreeMap <String,Enclavament> a_enclavaments;定义的TreeMap。我想使用TreeMap的每个Enclavament,所以我想看看它们运行一个方法,这就是我的意思:

for(int i = 0; i < a_enclavaments.size(); i++)
    modify(a_enclavaments.get(i));

modify需要Enclavament类中的项目。 但是,当我开始时,我收到此错误:

Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
    at java.lang.Integer.compareTo(Unknown Source)
    at java.util.TreeMap.getEntry(Unknown Source)
    at java.util.TreeMap.get(Unknown Source)

我不明白为什么。我已经阅读了java API,它说

get(Object key)
     Returns the value to which the specified key is mapped, or if this map contains no mapping for the key.

它不应该返回第一个,然后是第二个,然后第三个......来自TreeMap的Enclavament? 编辑:可能是因为我将TreeMap上的第一个参数设置为字符串,它必须是一个整数?

2 个答案:

答案 0 :(得分:4)

Map存储基于密钥的值。该键用于定义Map数据结构(数组,链表,树等等)中值的位置,具体取决于Map的实现。通过了解这一点,Map无法使用index概念,只能使用密钥。

在这种情况下,您需要将String值设置为关键字,但尝试使用Integer检索数据,并且异常非常明确:

  

java.lang.ClassCastExceptionjava.lang.String无法投放到java.lang.Integer

一种可能的解决方案可能是将密钥更改为Integer(如果可能)。

如果您希望/需要迭代Map上的值,您可以在Map#values上使用for循环:

for (Enclavament enclavement : a_enclavaments.values) {
    //do what you want/need
}

如果使用后者,则无需更改Map键的类型。

答案 1 :(得分:1)

您尝试访问根据地图的密钥类型不存在的条目(也就是说,您在传入时尝试查找String密钥Integer

在内部,地图会尝试将您传入的内容转换为您要搜索的键,以匹配地图定义为接受的键。 String无法投放到Integer,因此您的例外。

您似乎只想迭代地图的内容。这可以通过entrySet()

来完成
for(Map.Entry<String, Enclavement> entry : a_enclavement.entrySet()) {
    modify(entry.getValue());
}

Map.Entry<K, V>表示每个地图的键值对,以方便迭代。如果您想对地图上的所有键或所有值进行操作,那么这将是您希望从地图中获取的对象(如a_enclavement.entrySet())。