我目前有以下HTML格式的数据:
Year| car type | # of cars sold
2001| Toyota-Camry | 242435
2000| Honda-Accord | 344423
2001| Honda-Accord | 555255
2000| Honda-Civic | 342344
2008| Toyota-Prius | 666154
1996| Honda-Accord | 114526
2001| Toyota-Prius | 90234
为了检索此数据,我有一个BufferedReader,它从HTML中读取行.由于存在空白,我在数据出现之前先跳过了几行.所以我的代码目前是
public class carSales {
private Map<Integer, HashMap<Integer, String>> carSalesMan =
new HashMap <Integer, HashMap<Integer, String>>;
private void getcarTypes(String url) {
try {
URL urlz = new URL(url);
URLConnection urlc = myURL.openConnection();
BufferedReader line = new BufferedReader
(new InputStreamReader(urlConnection.getInputStream()));
String next;
next = line.readLine();
while (next.contains("</s>") {
String[] parts = next.split(" ");
if (carSalesMan.isEmpty() || carSalesMan.get(Integer.parseInt(parts[0])) == null {
carSalesMan.put(Integer.parseInt(parts[0], new HashMap<Integer, String>());
carSalesMan.get(Integer.parseInt(parts[0])).put(Integer.parseInt(parts[2]), parts[1])
}
}
catch (IOException e) {
}
}
问题是它似乎只存储具有唯一年份的数据.所以我的carSalesMan变量的大小为4,因为我只有4个唯一的年份,并且随着列表的减少,它们彼此覆盖.有没有简单的方法可以添加所有车型,即使是同一年呢?
解决方法:
由于您的if陈述,只有一项:
if (carSalesMan.isEmpty() || carSalesMan.get(Integer.parseInt(parts[0])) == null {
您有两个选择,如果您想为每个项目使用不同的插槽,则需要使用@JacobG.答案,或者您可以删除此if语句,并使用一种地图项来存储其值的集合.您将有两种方法来进行第二种选择:
我相信您想要的是MultiValueMap而不是HashMap,它的工作原理几乎与HashMap完全相同,不同之处在于它将值存储在每个键的集合中,而不是每个键仅存储一个值.
它不是官方的Java,但是是开源的.
您可以在这里找到文档:
或者,您可以使用扩展HashMap< K,V>的自定义类自己实现它.封装了HashMap< K,Collecton< V>