【问题标题】:How parse string into map,the string read from a file location using java如何将字符串解析为映射,使用java从文件位置读取的字符串
【发布时间】:2015-01-08 22:05:05
【问题描述】:

我想从我的驱动程序位置读取文件并将文件数据解析为地图,文件类型文本和包含数据如下所示

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请解决这个问题

【问题讨论】:

  • 您上一个问题的答案有什么问题?
  • 抱歉,您的回答无法满足我的查询。

标签: java dictionary hashmap bufferedreader filereader


【解决方案1】:

数字周围的空格字符导致 NumberFormatException,并且城市名称周围有空格字符,因此更改此行

amap.put(pair[i], Integer.parseInt(pair[1 + i]));

到这里

amap.put(pair[i].trim(), Integer.parseInt(pair[1 + i].trim()));

将 catch 块留空是一种非常糟糕的做法,它隐藏了问题(在这种情况下是 NumberFormatException)。

【讨论】:

  • 显示结果 java.lang.ArrayIndexOutOfBoundsException 查看我的编辑问题
  • 仅当您至少有一行包含无效数据时,可能最后一行包含空格字符。您可以跳过无效行: while ((ss = buf.readLine()) != null) { String[] pair = ss.split(":"); if(pair.length!=4){ System.out.println("无效的token数:"+pair.length);继续; } for (int i = 0; i
【解决方案2】:

如果您也想添加阅读器,这应该可以解决您的问题。这只有在配对的部分不可能在不同的行上时才有效。

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) {}

【讨论】:

  • 对不起@austin wernli,显示结果 java.lang.ArrayIndexOutOfBoundsException 请参阅我的编辑问题
【解决方案3】:

你没有说你得到了什么错误,但我希望你看到

java.lang.NumberFormatException:对于输入字符串:“1”

对吗?

如果是这样,答案是因为用

分割字符串 ss

String[] 对 = ss.split(":");

会导致

“达卡”、“1”、“贾马尔普尔城”、“2”

随心所欲 “达卡”、“1”、“贾马尔普尔市”、“2”

那些多余的空格会阻止整数解析。我建议你用 String[] 对 = ss.split(" : ");

【讨论】:

  • 显示结果 java.lang.ArrayIndexOutOfBoundsException
【解决方案4】:
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&lt;String, Integer&gt; amap = new LinkedHashMap&lt;String, Integer&gt;(); 以查看您的元素的有序版本。

更多补充说明:

它也适用于每行 (Key & Value) 对的数量不同的情况,例如:

dhaka : 1 : jamalpur City : 2 : v : 5
khulna City : 3 : Bangladesh : 1 : w : 5
x : 5
y : 9 : m : 2 

【讨论】:

  • 在这种情况下你是对的,但是当一行时..> dhaka : 1 : jamalpur City : 2 : Bangladesh : 1 next line..>khulna City : 3 表示偶数或奇数索引,会发生什么
  • 非常感谢你亲爱的利他主义者@fev,我放弃投票
  • @SakibHasan,我真的很抱歉,我之前的答案是错误的,从技术上讲,你迭代数组的方式是正确的,问题在于应该调用的 .trim() 本身.pair[i+1] ,看我的最后一次更新..,除了我之外的每个人都是正确的检查他们的答案之一..不是我的:)
  • 我测试了你以前的代码是正确的,但现在编辑的代码没有显示任何结果
  • @SakibHasan,它显示了结果,但如果你没看错,并不是所有的元素都会显示出来。 :)
【解决方案5】:

您在 : 和值之间有空格,当您尝试解析 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,因为它更适合这个问题。

【讨论】:

  • 这会将所有多个单词键更改为一个名称键..(jamalpur City 将变为jamalpurCity
  • @austinwernli 你确实是对的,在这种情况下,这应该只应用于 pair[i + 1] 字符串。我将编辑我的答案,
  • 显示结果 java.lang.ArrayIndexOutOfBoundsException
  • edit,发现异常:当您在一行中有奇数个值时出现异常...一种可能的解决方法是在循环中从 1 开始您的 i,然后您访问索引 i -1 和 i... 这样最后的唯一值就被跳过了。请参阅我的第二次编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-18
  • 1970-01-01
  • 2012-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多