java - 如何将表格转换为 map 的 map

标签 java collections

我有一个看起来像这样的 CSV 文件:

request.car.model (STRING),request.car.make (STRING),request.person.lastname (STRING),other.person.birthdate (DATE),other.person.length (INTEGER)
BMW,7 series,Doe,31/12/1980,170
Tesla,Model S,Smith,1/1/1975,172
Volvo,C40,Johnson,13/11/1982,189

第一行是 header ,括号内是解析的类型。 header 使用点表示法,非常类似于 Javascript 解析复杂对象的方式。

我需要做的是创建一个Java Map<String, Serializable>对于 CSV 文件中的每一行。例如,第一行需要生成 map在 Java 中看起来像这样:

Map<String, Serializable> requestCarMap = new HashMap<>();
requestCarMap.put("make", "BMW");
requestCarMap.put("model", "7 series");
Map<String, Serializable> requestPersonMap = new HashMap<>();
requestPersonMap.put("lastName", "Doe");
Map<String, Serializable> requestMap = new HashMap<>();
requestMap.put("car", (HashMap) requestCarMap);
requestMap.put("pesron", (HashMap) requestPersonMap);
Map<String, Serializable> otherPersonMap = new HashMap<>();
otherPersonMap.put("birthdate", new Date(1980,12,31));
Map<String, Serializable> otherMap = new HashMap<>();
otherMap.put("person", (HashMap) otherPersonMap);
Map<String, Serializable> map = new HashMap<>();
map.put("request", (HashMap) requestMap);
map.put("other", (HashMap) otherMap);

我目前有一种方法可以根据值创建 map ,但是无需拆分标题并将其放入子 map 中:

protected static Map<String, Serializable> parseRecord(CSVRecord record, CSVRecord header) {
    final Map<String, Serializable> map = new HashMap<>();
    for (int i = 0; i < record.size(); i++) {
        String headerField = getHeader(header.get(i));
        String[] headerFieldPart = headerField.split("\\.");
        String headerFieldType = getHeaderFieldType(header.get(i));
        Object recordField = getRecordField(headerFieldType, record.get(i));
        if (recordField != null) {
            map.put(headerField, (Serializable) recordField);
        } else {
            log.warn("Skipped value for record item: "
                    + record.get(i));
        }
    }
    return map;
}

如何以通用方式将值放入示例中的 subMap 中?我不知道列的名称或 map 预先​​嵌套的深度。我只是无法弄清楚在 subMap 尚不存在、存在等情况下起作用的逻辑。有什么聪明的解决方案吗?有什么库可以帮助我解决这个问题吗?

最佳答案

基本上,在点处分割标题,迭代各个部分,并根据相关部分切换目标 map 指针。

像这样(假设你已经下载了 CSV 文件):

public static void main(String[] args) {
    String[] headers = { "request.car.model", "request.car.make", "request.buyer" }; 
    String[] values = { "a", "b", "c" };

    Map<String, Serializable> outer = new HashMap<>();

    for(int i = 0; i < headers.length; i++) {
        String header = headers[i];
        String value  = values[i];

        String[] parts = header.split("\\.");
        Map<String, Serializable> targetMap = outer;
        for(int j = 0; j < parts.length - 1; j++)
            targetMap = (Map<String, Serializable>) targetMap.computeIfAbsent(parts[j], x -> new HashMap<>());
        targetMap.put(parts[parts.length - 1], value);
    }

    System.out.println(outer.get("request"));
}

请注意,这仅在 header 一致的情况下才有效,即不存在“a.a”值后跟“a.a.b”值之类的情况。

关于java - 如何将表格转换为 map 的 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39532461/

相关文章:

Java 字符串长度不能正常工作

java - 以编程方式知道在 tomcat 中发出的请求来自哪个连接器

java - 如何在java中从 vector 的 vector 中打印

collections - groovy:更改列表的每个元素并加入

java - 根据对象列表中的某些字段获取最小对象

java - 如何使用 procedure 来终止从 java 代码调用它的作业?

java - JSONArray 空内容 Java 和 Android

python - Collections.Counter 如何实现快速排序?

所有对的Java算法

java - 如何实现基于不同条件的集合过滤