如果找到重复的密钥,如何创建新的HashMap?

时间:2012-03-11 04:11:40

标签: java hashmap

我有一个包含许多记录的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));
    }
}

2 个答案:

答案 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

所以你在概念上是一个集合对象,每个集合对象是一组五个名称/值对,你的目标是将所有这些对象加载到内存中。你有两个选择:

  1. A Map<String,Map<String,String>> - 如果每组五个名称/值对包含一个唯一键(例如,可能与name1相关联的值),则可以使用此项来区分这些组
  2. A List<Map<String,String>> - 如果组没有唯一键,则使用此选项,该文件只是这些名称/值对集的线性集合。
  3. 以下是第一个选项的示例;适应第二个是作为练习:

    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可以快速检索特定键的值。这里每个键都映射到一个特定的值。因此,您不能拥有多个具有相同值的键。