我有一个包含许多记录的txt文件,每个记录有5行并且是名称 - 值对。
我已经解析了文件,并使用扫描程序将名称和值放入哈希映射中,以检测文件是否为hasNextLine。
此时因为所有记录都在同一个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));
}
}
答案 0 :(得分:2)
如果我理解你的问题,你有一个文本文件:
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);
}
答案 1 :(得分:0)
HashMap可以快速检索特定键的值。这里每个键都映射到一个特定的值。因此,您不能拥有多个具有相同值的键。