我想从我的驱动程序位置读取文件并将文件数据解析为map,文件类型文本和包含数据如下所示
dhaka : 1 : jamalpur City : 2
khulna City : 3 : Bangladesh : 1
我正在努力解决这个问题,但总是无法解决。请帮助我, 这是我的代码
Map < String, Integer > amap = new HashMap < String, Integer > ();
try {
BufferedReader buf = new BufferedReader(new FileReader("D:\\t.txt"));
String ss = null;
while ((ss = buf.readLine()) != null) {
String[] pair = ss.split(":");
for (int i = 0; i < pair.length; i += 2)
amap.put(pair[i], Integer.parseInt(pair[1 + i]));
}
buf.close();
for (Map.Entry em: amap.entrySet()) {
System.out.println(" " + em.getKey() + " " + em.getValue());
}
} catch (Exception e) {e.printStackTrace( );}
显示java.lang.ArrayIndexOutOfBoundsException
请解决此问题
答案 0 :(得分:1)
for (int i = 0; i < pair.length; i += 2)
amap.put(pair[i], Integer.parseInt(pair[1 + i]));
应该是:
EDIT
:
for (int i = 0; i <pair.length; i +=2) {
amap.put(pair[i].trim(), Integer.parseInt(pair[(1 + i)].trim()));
}
附加说明:
如果您看到元素没有排序,那是因为HashMap
没有维护订单,您应该更改为Map<String, Integer> amap = new LinkedHashMap<String, Integer>();
以查看元素的有序版本。
更多附加说明:
它也适用于每一行(Key
&amp; Value
)对的数量不同,例如:
dhaka : 1 : jamalpur City : 2 : v : 5
khulna City : 3 : Bangladesh : 1 : w : 5
x : 5
y : 9 : m : 2
答案 1 :(得分:1)
如果你想添加一个阅读器,这应该可以解决你的问题。只有当部分对不在单独的行上时,这才有效。
Map < String, Integer > amap = new HashMap < String, Integer > ();
try {
BufferedReader buf = new BufferedReader(new FileReader("D:\\t.txt"));
String ss = null;
while ((ss = buf.readLine()) != null) {
String[] ssPairs = ss.split(" : ");
for (int i = 0; i < splt.length; i += 2) {
amap.put(ssPairs[i], Integer.parseInt(ssPairs[i + 1]));
}
}
buf.close();
for (Map.Entry em: amap.entrySet()) {
System.out.println(" " + em.getKey() + " " + em.getValue());
}
} catch (Exception e) {}
答案 2 :(得分:1)
你没有说出你得到的错误,但我希望你看到
java.lang.NumberFormatException:对于输入字符串:&#34; 1&#34;
这是对的吗?
如果是这样,答案是因为用
拆分String ssString [] pair = ss.split(&#34;:&#34;);
将导致
&#34; dhaka&#34;,&#34; 1&#34;,&#34; jamalpur City&#34;,&#34; 2&#34;
你想要的地方 &#34; dhaka&#34;,&#34; 1&#34;,&#34; jamalpur City&#34;,&#34; 2&#34;
这些额外的空格将阻止整数解析。我建议拆分你 String [] pair = ss.split(&#34;:&#34;);
答案 3 :(得分:1)
数字周围的空格字符导致NumberFormatException,并且城市名称周围有空格字符,因此更改此行
amap.put(pair[i], Integer.parseInt(pair[1 + i]));
到这个
amap.put(pair[i].trim(), Integer.parseInt(pair[1 + i].trim()));
将catch块留空是一个非常糟糕的做法,它隐藏了问题(在这种情况下为NumberFormatException)。
答案 4 :(得分:1)
在和值之间有空格,当您尝试解析int时会导致NumberFormatException。
可能的替代方案是:
Map < String, Integer > amap = new HashMap < String, Integer > ();
try {
BufferedReader buf = new BufferedReader(new FileReader("D:\\t.txt"));
String ss = null;
while ((ss = buf.readLine()) != null) {
String[] pair = ss.split(":");
for (int i = 0; i < pair.length; i += 2)
amap.put(pair[i], Integer.parseInt(pair[1 + i].replaceAll("\\s+","")));
}
buf.close();
for (Map.Entry em: amap.entrySet()) {
System.out.println(" " + em.getKey() + " " + em.getValue());
}
} catch (Exception e) {
e.printStackTrace( ); // shows a NumberFormatException
}
bhspencer的回答也适用,使用ss.split(“:”);
此外,如果您的程序出现问题,请务必检查您的异常,它们通常非常有用。
如@austinwernli所指出的编辑,替换整行中的空格也会删除多世界条目中的空格。因此,replaceAll函数应该应用于配对[i + 1]。
编辑2: ArrayIndexOutOfBoundsException来自像dhaka : 1 : jamalpur City : 2 : v : 5 : s :
解决方法可能是使用以下方法更改for循环:
for (int i = 1; i < pair.length; i += 2) {
amap.put(pair[i - 1], Integer.parseInt(pair[i].replaceAll("\\s+","")));
}
这样,在奇数大小的列表上跳过最后一个值。我还将replaceAll更改为trim,因为它更适合这个问题。