我有Map<List<String>,Integer>
,其中每个条目都是路径(List<String>
)和计数
例如:
["a1", "a2", "a3"] => 4
["a1", "a2"] => 2
["b1", "b2", "b3"] => 3
["b1"] => 4
["b1", "b2"] => 3
["c1", "c2", "c3", "c4"] => 5
我想输出一个每个节点都有计数的树
树:
- ROOT
-- a1 : 6
--- a2 : 6
---- a3 : 4
-- b1 : 7
--- b2 : 3
-- c1 : 5
--- c2 : 5
---- c3 : 5
----- c4 : 5
JSON结构:
{
"name": "",
"count": "",
"children": [
{
"name": "",
"count": "",
"children": []
}
]
}
什么是最有效的数据结构,然后在这种情况下如何使用它(树应该序列化为JSON树)?
答案 0 :(得分:2)
我将使用节点创建树结构,然后使用XStream来序列化结构。以下示例,希望这可以帮助您。
转换为节点结构
public static Node createNodes(Map<List<String>, Integer> map) {
Map<String, Node> namemap = new HashMap<String, Node>();
Node root = new Node();
Node current;
for (Entry<List<String>, Integer> path : map.entrySet()) {
current = root;
for (String nodename : path.getKey()) {
Node p;
if (!namemap.containsKey(nodename)){
p = new Node(nodename, path.getValue());
namemap.put(nodename, p);
}else {
p = namemap.get(nodename);
p.addCost(path.getValue());
}
current.addChild(p);
current = p;
}
}
return root;
}
<强>序列化强>
public static String toXML(Node n) {
XStream xstream = new XStream(new JsonHierarchicalStreamDriver());
xstream.alias("node", Node.class);
return xstream.toXML(n);
}
节点对象
public class Node {
private String name;
private int count;
private List<Node> children;
public Node() {
this(null, 0);
}
public Node(String name, int count) {
this.name = name;
this.count = count;
this.children = new ArrayList<Node>();
}
public void addChild(Node n) {
for (Node nn : children) {
if (nn.name.equals(n.name)) {
return;
}
}
this.children.add(n);
}
public void addCost(int i) {
this.count += i;
}
}
JSON输出
{"node": {
"count": 0,
"children": [
{
"name": "c1",
"count": 5,
"children": [
{
"name": "c2",
"count": 5,
"children": [
{
"name": "c3",
"count": 5,
"children": [
{
"name": "c4",
"count": 5,
"children": [
]
}
]
}
]
}
]
},
{
"name": "b1",
"count": 10,
"children": [
{
"name": "b2",
"count": 6,
"children": [
{
"name": "b3",
"count": 3,
"children": [
]
}
]
}
]
},
{
"name": "a1",
"count": 6,
"children": [
{
"name": "a2",
"count": 6,
"children": [
{
"name": "a3",
"count": 4,
"children": [
]
}
]
}
]
}
]
}}
答案 1 :(得分:0)
我个人而言,我会创建一个具有子项和我的计数值的Node类,然后告诉JSON序列化程序如何根据您的需要正确地序列化它。
答案 2 :(得分:0)
我会将您的地图更改为:
Map<String[], Integer>
如果您想留在列表中,请使用ArrayList
和trim(
)。
然后你必须决定是否使用HashMap
,或者你真的想要一棵树(TreeMap
)。
在后一种情况下,您应该创建一个Path对象,其中包含字段String[]
或List<String>
然后,此Path对象必须实现您需要实现的Comparable
。
要执行Serialisation
(Json或其他系统),您通常会写出键值对。再次回读时,您将通过输入(键,值)对再次构建地图或树。
在json或其他序列化文件中使用树结构不是一个好主意。你几乎不需要那个。