如何将字符串解析为映射,使用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 因为它更适合这个问题。