如何将字符串解析为映射,使用java从文件位置读取的字符串
How parse string into map,the string read from a file location using java
我想从我的驱动程序位置读取一个文件并将文件数据解析为映射,文件类型文本和包含数据如下所示
dhaka : 1 : jamalpur City : 2
khulna City : 3 : Bangladesh : 1
我正在尝试解决这个问题,但总是unable.Please帮助我,
这是我的代码
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
请解决这个问题
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
& Value
) 对的数量不同的情况,例如:
dhaka : 1 : jamalpur City : 2 : v : 5
khulna City : 3 : Bangladesh : 1 : w : 5
x : 5
y : 9 : m : 2
如果您也想添加 reader,这应该可以解决您的问题。这只有在部分对不可能在不同的行上时才有效。
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) {}
你没有说你遇到了什么错误,但我希望你能看到
java.lang.NumberFormatException:对于输入字符串:“1”
对吗?
如果是这样,答案是因为用
拆分了字符串 ss
字符串[]对=ss.split(":");
将导致
"dhaka "、“1”、“贾马尔布尔市”、“2”[=10=]
随心所欲
"dhaka"、“1”、"jamalpur City"、“2”[=10=]
这些额外的空格会阻止整数解析。我建议将你的字符串拆分为
String[] 对 = ss.split(" : ");
数字周围的 space 个字符导致 NumberFormatException,并且城市名称周围有 space 个字符,因此请更改此行
amap.put(pair[i], Integer.parseInt(pair[1 + i]));
至此
amap.put(pair[i].trim(), Integer.parseInt(pair[1 + i].trim()));
将 catch 块留空是一个非常糟糕的做法,它隐藏了问题(在本例中为 NumberFormatException)。
您在 : 和值之间有空格,这会在您尝试解析 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 函数应该应用于 pair[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 因为它更适合这个问题。
我想从我的驱动程序位置读取一个文件并将文件数据解析为映射,文件类型文本和包含数据如下所示
dhaka : 1 : jamalpur City : 2
khulna City : 3 : Bangladesh : 1
我正在尝试解决这个问题,但总是unable.Please帮助我, 这是我的代码
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
请解决这个问题
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
& Value
) 对的数量不同的情况,例如:
dhaka : 1 : jamalpur City : 2 : v : 5
khulna City : 3 : Bangladesh : 1 : w : 5
x : 5
y : 9 : m : 2
如果您也想添加 reader,这应该可以解决您的问题。这只有在部分对不可能在不同的行上时才有效。
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) {}
你没有说你遇到了什么错误,但我希望你能看到
java.lang.NumberFormatException:对于输入字符串:“1”
对吗?
如果是这样,答案是因为用
拆分了字符串 ss字符串[]对=ss.split(":");
将导致
"dhaka "、“1”、“贾马尔布尔市”、“2”[=10=]
随心所欲 "dhaka"、“1”、"jamalpur City"、“2”[=10=]
这些额外的空格会阻止整数解析。我建议将你的字符串拆分为 String[] 对 = ss.split(" : ");
数字周围的 space 个字符导致 NumberFormatException,并且城市名称周围有 space 个字符,因此请更改此行
amap.put(pair[i], Integer.parseInt(pair[1 + i]));
至此
amap.put(pair[i].trim(), Integer.parseInt(pair[1 + i].trim()));
将 catch 块留空是一个非常糟糕的做法,它隐藏了问题(在本例中为 NumberFormatException)。
您在 : 和值之间有空格,这会在您尝试解析 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 函数应该应用于 pair[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 因为它更适合这个问题。