我有一个HashMap
,其中密钥的类型为String
,其值为LinkedList
类型的String
。
所以基本上,这就是我想要做的。
while (contentItr.hasNext()) {
String word = (String) contentItr.next();
if (wordIndex.containsKey(word)) {
LinkedList temp = (LinkedList) w.get(word); //Error occurs here
temp.addLast(currentUrl);
} else {
w.put(word, new LinkedList().add(currentUrl));
}
}
我第一次添加键值对时,没有收到任何错误。但是,当我尝试检索与现有密钥关联的链接列表时,我得到以下异常:
java.lang.Boolean cannot be cast to java.util.LinkedList.
我无法解释为什么会发生此异常。
答案 0 :(得分:11)
请改为尝试:
while (contentItr.hasNext()) {
String word = (String) contentItr.next();
if (wordIndex.containsKey(word)) {
LinkedList temp = (LinkedList) w.get(word);
temp.addLast(currentUrl);
} else {
LinkedList temp = new LinkedList();
temp.add(currentUrl);
w.put(word, temp);
}
}
正如您所看到的,问题在于向Map添加新元素的行 - 方法add
返回一个布尔值,这就是添加到Map的内容。上面的代码修复了问题,并将您想要的内容添加到Map中 - 一个LinkedList。
另外,请考虑在代码中使用泛型类型,这样可以防止这样的错误。我会尝试猜测你的代码中的类型(必要时调整它们,你明白了),假设你在程序的某个地方有这些声明:
Map<String, String> wordIndex = new HashMap<String, String>();
Map<String, LinkedList<String>> w = new HashMap<String, LinkedList<String>>();
List<String> content = new ArrayList<String>();
Iterator<String> contentItr = content.iterator();
这样,您的问题中的代码片段可以安全地编写,避免不必要的强制转换和类型错误,如您所拥有的那样:
while (contentItr.hasNext()) {
String word = contentItr.next();
if (wordIndex.containsKey(word)) {
LinkedList<String> temp = w.get(word);
temp.addLast(currentUrl);
} else {
LinkedList<String> temp = new LinkedList<String>();
temp.add(currentUrl);
w.put(word, temp);
}
}
修改强>
根据以下评论 - 假设您实际上可以用LinkedList
替换ArrayList
(某些操作可能会更快)并且只有 LinkedList
- 您正在使用的具体方法是addLast
(这是add
的同义词),上面的代码可以按如下方式重写,更多对象 - 使用接口而不是容器的具体类的定向样式:
Map<String, String> wordIndex = new HashMap<String, String>();
Map<String, List<String>> w = new HashMap<String, List<String>>();
List<String> content = new ArrayList<String>();
Iterator<String> contentItr = content.iterator();
while (contentItr.hasNext()) {
String word = contentItr.next();
if (wordIndex.containsKey(word)) {
List<String> temp = w.get(word);
temp.add(currentUrl);
} else {
List<String> temp = new ArrayList<String>();
temp.add(currentUrl);
w.put(word, temp);
}
}
答案 1 :(得分:6)
List.add
返回boolean
,自动装箱到Boolean
。你的else子句正在创建一个LinkedList,在其上调用一个返回布尔值的方法(add
),并将生成的自动布尔布尔值放入地图中。
你知道泛型吗?您应该键入w作为Map<String,List<String>>
,而不仅仅是Map。如果你这样做,那么这个错误就会在编译时被捕获。