我有一个文本文件,其数据如下:
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();
答案 0 :(得分:2)
由于您的每一行都是这样的:
Surrender~abc~nov@2012
按~
分割后有三个部分:
Surrender
abc
nov@2012
这些部分的编号从0
到2
。
解决方案:不要遍历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]);
}