【问题标题】:Flatten nested Hashmap in Java在 Java 中展平嵌套的 Hashmap
【发布时间】:2020-10-29 08:03:59
【问题描述】:

我想展平嵌套的哈希图。例如,

Map<String, Object> map = new HashMap();
Map<String, Object> map2 = new HashMap();
Map<String, Object> map3 = new HashMap();
map3.put("key3", 123);
map2.put("key2", map3);
map2.put("key4", "test");
map.put("key1", map2);
map.put("key6", "test2");

这将具有类似于此的结构:

{
 "key1" : {
            "key2" :  {"key3" : 123 },
            "key4" : "test"  
          },
 "key6" : "test2"
}

这应该被展平为一个结构类似于这样的哈希图:

{
    "key1.key2.key3" : 123,   
    "key1.key4" : "test",
    "key6" : "test2"
}

我尝试在 Java 中递归地解决这个问题,但无法生成正确的形式。任何帮助表示赞赏。

【问题讨论】:

  • 你在谈论一个Hashmap,但是发布数据结构。您可以添加您的 Java 代码的 sn-p 吗?这将使某人更容易创建有帮助的答案。
  • 这是数据在 hashmap 中的存储结构。不过,我也更新了它。
  • 我知道这并不能回答您的问题,但是将对象存储在地图中确实是一种不好的做法,并且会导致各种难以处理的问题。查看您实际尝试解决的问题,看看您是否可以使用类型化地图来解决。

标签: java recursion hashmap java-stream


【解决方案1】:

可以使用Stream#flatMap 和递归来实现。

flatMapper() 将被递归调用,它会返回一个带有子键的字符串生成器流。

public class NestedHashMap {

    private static Stream<StringBuilder> flatMapper(Map.Entry<String, Object> entrySet) {
        Object value = entrySet.getValue();
        if (value instanceof Map) {
            return ((Map<String, Object>) value).entrySet()
                                                .stream()
                                                .flatMap(NestedHashMap::flatMapper)
                                                .map(s -> s.insert(0, entrySet.getKey() + "."));

        }
        return Stream.of(new StringBuilder(entrySet.toString()));
    }

    public static void main(String[] args) {
        // ... Code in the question

        System.out.println(map.entrySet()
                              .stream()
                              .flatMap(NestedHashMap::flatMapper)
                              .collect(Collectors.joining(",\n\t", "{\n\t", "\t\n}")));
    }
}

输出:

{
    key1.key2.key3=123,
    key1.key4=test,
    key6=test2  
}

【讨论】:

  • 你能建议一个没有流的答案吗?
猜你喜欢
  • 2018-07-10
  • 2015-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-10
  • 2022-06-21
  • 1970-01-01
  • 2011-02-16
相关资源
最近更新 更多