【问题标题】:Groovy: Create Object for add in LinkedHasMapGroovy:创建对象以添加到 LinkedHashMap
【发布时间】:2020-05-29 23:30:41
【问题描述】:

我是 Groovy 和 Java 的新手。 我有从某个对象返回 LinkedHashMap 的函数。它的工作原理:

def get_map(Node) {
    nodeRootName = Node.name() 
    if (Node.childNodes().size() == 0) {
        return [(nodeRootName): (Node.text())]
    } else {
        subMap = [(nodeRootName):[]]
        for (subNode in Node.childNodes()) {
            if (subNode.name() != "cryptoSigns") {
                subMap.(subMap.keySet()[0]).add(get_map(subNode))
            }    
        }
        return subMap
    }
}

在代码中调用这个函数:

    nodeMap = [(rootNodeName): [data:[]]] 
    for (subNode in node.childNodes()[0].childNodes()) {
            nodeMap.position.data.add(get_map(subNode))
        }
    } 

组成LinkedHashMap的数组[data:[]]

现在,我需要从数组中创建一个 LinkedHasMap。 我尝试在我的函数中制作一张地图。它可以是一个地图或带有键的地图数组。例如:

[data:[
 key1: value,
 key2:[
   [key: value],
   [key: [
    [key: value],
    [key: value]
   ]
 ]
]]

我试试:

def get_map(Node) {
    nodeRootName = Node.name() 
    if (Node.childNodes().size() == 0) {
        Map map = new HashMap()
        map.put((nodeRootName), (Node.text()))
        return map
    } else {
        Map subMap = new HashMap()
        for (subNode in Node.childNodes()) {
            subMap.put((nodeRootName), (get_map(subNode)))    
        }
        return subMap
    }
}

调用函数:

 Map nodeMap = new HashMap()
 Map data = new HashMap()
 for (subNode in node.childNodes()[0].childNodes()) {
      data.put(get_map(subNode))
      nodeMap.put((rootNodeName): (data))
 }  
 jsonObject.nsiKTRUs.add(nodeMap)  

但我有错误: groovy.lang.MissingMethodException:没有方法签名:java.util.HashMap.put() 适用于参数类型:(HashMap) 值:[[code:01.11.11.111-00001]] at data.put(get_map(subNode))

在地图中添加我的值有多正确? 我的输入数据:

<xml>
 <data>
   <key>value</key>
     <key2>
       <key21>value</key>
       <key22>value</key>
       <key23>
         <key231>value</key>
       </key>
    </key2>
 </data>
<xml>

自定义嵌入。

需要输出

[data:[
    key: value, 
    key2:[
        key21: value, 
        key22: value, 
        key23:[
          key231: value
        ]
     ]
 ]
]

输出数据需要添加到另一个LinkedHashMap

【问题讨论】:

  • 阅读上面的“代码”真的很痛苦......你能简单地显示输入数据和所需的输出吗?
  • 输入:&lt;xml&gt;&lt;data&gt;&lt;key&gt;value&lt;/key&gt;&lt;key2&gt;&lt;key21&gt;value&lt;/key&gt;&lt;key22&gt;value&lt;/key&gt;&lt;key23&gt;&lt;key231&gt;value&lt;/key&gt;&lt;/key&gt;&lt;/key2&gt;&lt;/data&gt;&lt;xml&gt; 输出[data:[key: value, key2: [key21: value, key22: value, key23:[key231: value]]]]
  • 我只需要得到这张地图:[data:[key: value, key2: [key21: value, key22: value, key23:[key231: value]]]]
  • 把那些请放到你原来的问题中,这样它更具可读性
  • 我更新我的帖子

标签: java groovy


【解决方案1】:

我会把它写成这样的:

import groovy.util.*
import groovy.json.*


def text = '''<xml>
<data>
  <key>value1</key>
    <key2>
      <key21>value21</key21>
      <key22>value22</key22>
      <key23>
        <key231>value</key231>
      </key23>
   </key2>
</data>
</xml>'''

def xml = new XmlParser().parseText( text )

def handle
handle = { node ->
  if( node in String )
    node
  else{
    def val = node.collect handle
    [ (node.name()):1 == val.size() ? val.first() : val.collectEntries{ it } ]
  }
}

def map = xml.collect handle

// this line is needed for pretty print only
JsonOutput.prettyPrint JsonOutput.toJson( map )

输出:

[
    {
        "data": {
            "key": "value1",
            "key2": {
                "key21": "value21",
                "key22": "value22",
                "key23": {
                    "key231": "value"
                }
            }
        }
    }
]

【讨论】:

    【解决方案2】:

    这对我有好处 nodeMap[(rootNodeName)] &lt;&lt; data

    【讨论】:

      猜你喜欢
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-09
      • 2013-03-06
      • 1970-01-01
      相关资源
      最近更新 更多