如何将字符串解析成map,使用java从文件位置读取字符串

时间:2015-01-08 22:05:05

标签: java dictionary hashmap bufferedreader filereader

我想从我的驱动程序位置读取文件并将文件数据解析为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请解决此问题

5 个答案:

答案 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 ss

String [] 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,因为它更适合这个问题。