我有一个包含许多记录的txt文件,每条记录有5行,并且是名称-值对。
我已经解析了该文件,并使用扫描仪检测文件是否有NextLine,将名称和值放入 HashMap 中。
此时因为所有记录都在同一个txt文件中,所以hashmap只包含文件中的最后一条记录。这是因为出现的任何重复键都会覆盖该键的值。
我的问题是如何为每条记录创建一个新的 HashMap ? 这是我建立记录的方法:
public void recordBuilder() throws FileNotFoundException{
FileReader reader = new FileReader(aFile);
Scanner outerScan = new Scanner(reader);
HashMap<String,String> record = new HashMap<String,String>();
while (outerScan.hasNextLine()){
Scanner innerScan = new Scanner(outerScan.nextLine());
try{
innerScan.useDelimiter(":");
String name = innerScan.next();
String value = innerScan.next();
String rName = name.trim();
String rValue = value.replaceAll("[^\\w]", "");
record.put(rName,rValue);
}
catch(Exception e){
}
}
for(String i : record.keySet()){
System.out.println(i + "\t" + record.get(i));
}
}
最佳答案
如果我正确理解你的问题,你有一个文本文件:
name1:value1
name2:value2
name3:value3
name4:value4
name5:value5
name1:value6
name2:value7
name3:value8
name4:value9
name5:value10
etc -- name1-5 repeat, with possibly different values
因此,从概念上讲,您拥有的是一个集合对象,每个对象都是一组五个名称/值对,您的目标是将它们全部加载到内存中。您有两个选择:
- 一个
Map<String,Map<String,String>>
- 如果每组五个名称/值对都包含一个可用于区分集合的唯一键(例如,可能与name1
关联的值),请使用此选项。 - 一个
List<Map<String,String>>
- 如果组没有唯一键,并且文件只是此类名称/值对组的线性集合,请使用此选项。
这是第一个选项的示例;将其调整为第二个作为练习:
String firstKey = "name1";
Map<String,Map<String,String>> recordset = new HashMap<String,HashMap<String,String>>();
Map<String,String> record = null;
String key = null;
while (outerScan.hasNextLine()){
Scanner innerScan = new Scanner(outerScan.nextLine());
try{
innerScan.useDelimiter(":");
String name = innerScan.next();
String value = innerScan.next();
String rName = name.trim();
String rValue = value.replaceAll("[^\\w]", "");
if (firstKey.equals(name))
{
if (record != null) recordset.put(key,record);
record = new HashMap<String,String>();
key = rValue;
}
if (record == null) throw new RuntimeException(String.format("First line was not '%s'",firstKey));
record.put(rName,rValue);
}
catch(Exception e){
/* DO NOT IGNORE EXCEPTIONS */
}
if (record != null) recordset.put(key,record);
}
关于java - 每当发现重复键时如何创建新的 HashMap?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9652367/