首页 文章

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

提问于
浏览
2

我有一个包含许多记录的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 回答

  • 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
    

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

    • A Map<String,Map<String,String>> - 如果每组包含五个名称/值对,则包含一个唯一键(例如,与 name1 关联的值),可用于区分这些组 .

    • A 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);
    }
    
  • 0

    HashMap为特定键提供了快速的值检索 . 这里每个键都映射到一个特定的值 . 因此,您不能拥有具有相同值的多个键 .

相关问题