java - 每当发现重复键时如何创建新的 HashMap?

标签 java hashmap

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

因此,从概念上讲,您拥有的是一个集合对象,每个对象都是一组五个名称/值对,您的目标是将它们全部加载到内存中。您有两个选择:

  1. 一个Map<String,Map<String,String>> - 如果每组五个名称/值对都包含一个可用于区分集合的唯一键(例如,可能与 name1 关联的值),请使用此选项。
  2. 一个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/

相关文章:

java - 如何按值对 Hashmap<String, Arraylist<String>> 类型的 Hashmap 进行排序?

C# hashtable 添加我自己创建的类

java - 打印 java map Map<String, Object> - 怎么样?

java - 数据源不能为空

java - JPQL:查询具有使用组合键建模的多对多关系的实体

java - 在 Java 中填充 Hashmap

java - Objective-C 的 NSDictionary 的 Java 等价物是什么?

java - 从文本文件初始化对象数组

java - 在 Java 中创建一个重复的定时器提醒

java - 两个日期之间的 Android 天数