0

我有一个文本文件,其数据如下:

Surrender~abc~nov@2012
Surrender~bnc~bhdgvx
Surrender~nkhjb~bcdjh
.
.
.

我想逐行分隔数据,并将 Hashmap 中的第二列和第三列值存储为 2nd -> key 和 3rd -> value,并检查用户输入的值是否存在于 Hashmap 中并返回 true。

我试过跟随但得到java.lang.ArrayIndexOutOfBoundsException: 3..请指导。

HashMap hm = new HashMap();
FileInputStream fstream = new FileInputStream("Surrender.txt");
DataInputStream in = new DataInputStream(fstream);
BufferedReader br = new BufferedReader(new InputStreamReader(in));

String strLine;
while ((strLine = br.readLine()) != null)   {
    String[] parts = strLine.split("~");
    for (int i = 0; i <= parts.length; i++) {
       if(!parts[i].equalsIgnoreCase("Surrender")){
    String key=parts[i];
    String value=parts[i++];
    if(key!=null && value!=null)
    hm.put(key,value);
}
    }
}

System.out.println("HashMap size..." + hm.size());
in.close();
4

3 回答 3

2

由于您的每一行都如下所示:

Surrender~abc~nov@2012

拆分后有三个部分~

  • Surrender
  • abc
  • nov@2012

这些部件的编号从02

解决方案:不要遍历parts. 改为这样做:

hm.put(parts[1], parts[2]);

删除这些行:

for (int i=0;i<=parts.length;i++) {
    if (!parts[i].equalsIgnoreCase("Surrender")) {
        hm.put(parts[i], parts[++i]);
    }
}

注意:使用泛型Map

Map<String, String> hm = new HashMap<>(); // Java 7
于 2012-11-05T11:12:39.810 回答
0

替换这个:

for (int i = 0; i <= parts.length; i++) {
    if (!parts[i].equalsIgnoreCase("Surrender")) {
        hm.put(parts[i], parts[++i]);
    }
}

if (parts.length > 2 && !parts[0].equalsIgnoreCase("Surrender")) {
    hm.put(parts[1], parts[2]);
}

如果问题中提供的数据总是三个部分,您可以跳过parts.length > 2

于 2012-11-05T11:14:52.447 回答
0

首先,请在您的 HashMap 上使用类型...

HashMap<String, String> hm = new HashMap<String, String>();

其次,如果拆分数组的大小固定,为什么要遍历它?我还相信,当您使用 [++i] 访问元素时,您会为自己制造问题,这会增加您的计数器。在通过拆分的循环的最后一次迭代中,这可能会使其超出范围。

尝试类似:

if (parts[0].equalsIgnoreCase("Surrender")) {
    hm.put(parts[1], parts[2]);
}
于 2012-11-05T11:17:18.357 回答