【问题标题】:Return a one-dimensional map from a nested map in groovy从groovy中的嵌套地图返回一维地图
【发布时间】:2017-12-16 04:56:26
【问题描述】:

我想从嵌套地图中获取平面地图。扁平化地图的键必须用点分隔。

例如,

def map = ['environment':'production', 'classes':['nfs-server':['exports':['/srv/share1', '/srv/share3']]], 'parameters':'null']

预期的输出是

[environment:'production', classes.nfs-server.exports:['/srv/share1', '/srv/share3'], parameters:'null']

我环顾四周,想出了以下使用递归的代码 sn-p。这是代码

def Map<String, String> getNestedMapKeys(Map map, String keyPrefix = '') {
def result = [:]
map.each { key, value ->
  if (value instanceof Map) {
    result += getNestedMapKeys(value, keyPrefix += "$key.")
  } else {
    String finalKey = "$keyPrefix$key"
    // need to wrap in parenthesis because it's a variable
    result << [(finalKey): value]
  }
}
result

}

运行它的输出是

[environment:'production', classes.nfs-server.exports:['/srv/share1', '/srv/share3'], classes.parameters:'null']

所以嵌套映射后处理的键仍然保留前缀。在这种情况下,“classes.parameters”应该只是“参数”。任何修复它的帮助表示赞赏。谢谢。

【问题讨论】:

    标签: java dictionary groovy nested


    【解决方案1】:

    想通了。需要在处理主地图中的嵌套地图结束时重置“keyPrefix”变量。

    def Map<String, String> getNestedMapKeys(Map map, String keyPrefix = '') {
    def result = [:]
    map.each { key, value ->
      if (value instanceof Map) {
        print 'key prefix is ' + keyPrefix
        result += getNestedMapKeys(value, keyPrefix += "$key.")
        keyPrefix = ''
      } else {
        String finalKey = "$keyPrefix$key"
        // need to wrap in parenthesis because it's a variable
        result << [(finalKey): value]
      }
    }
    result
    }
    

    【讨论】:

      【解决方案2】:

      这个怎么样?

      def flattenMap(Map map) {
          map.collectEntries { k, v ->
              v instanceof Map ?
                  flattenMap(v).collectEntries { k1, v1 ->
                      [ "${k}.${k1}": v1 ]
                  }
              :
                  [ (k): v ]
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-22
        • 1970-01-01
        相关资源
        最近更新 更多