拆分文本文件的字符串并将其存储在HashMap中

时间:2012-11-05 11:10:11

标签: java hashmap

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

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

我希望逐行分隔数据,并将Hashmap中的第二和第三列值存储为第二个 - > 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();

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分:0)

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

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

其次,如果固定大小,为什么要遍历split数组呢?当你使用[++ i]访问一个元素时,我也相信你会为自己创造问题,这会增加你的计数器。在循环到分割的最后一次迭代中,这可能使它超出界限。

尝试类似:

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