List递归算法

jrosion 2010-01-18 03:00:41
我有一个List里面是保存的是一个KrSysModule对象, 现在想根据List内容生成一个xml字符串。写了几遍,没有写出来,望大侠赐教。。
KrSysModule对象字段:
private String node ;
private String name;
private String parentNode;

数据格式
-----------------------------
node name parentNode
0 根节点
0001 节点1 0
0001001 节点11 0001
0002 节点2 0


我想上面个数输出数据格式为String,格式为:
<XML>
<node name='根节点'>
<node name='节点1>
<node name='节点11'>
</node>
</node>

<node name='节点2'>
</node>
</node>

</XML>

当然节点的子节点没有限制。。
...全文
524 30 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
zings 2010-02-02
  • 打赏
  • 举报
回复
mark 。。。
nihuajie05 2010-01-19
  • 打赏
  • 举报
回复
好吧,都用上JDOM包包了。
当俺米说吧
nihuajie05 2010-01-19
  • 打赏
  • 举报
回复
XML本身用树型结构来描述不是更好么。
左边儿子,右边兄弟的。
先生成一个树,
然后通过递归来生成XML文件。
否则光是LIST的遍历就够呛
jrosion 2010-01-19
  • 打赏
  • 举报
回复
谢谢各位的指点,,mayuanfei,老大你写的方法把挺好,但是加jdom包,,我想了一个办法,,简单实用,,用正则表达式去做,,很简单。老大们可以看看,指点一下。


public String getTree(String condition) {

String result = "<XML>";

List data = this.query(condition, "0");

for (int i = 0; i < data.size(); i++) {
KrSpDataDictionary krSpDataDictionary = (KrSpDataDictionary) data
.get(i);

String _regexp = "(.*?)(<node id='" + krSpDataDictionary.getParentNode()
+ ".*?>)(.*?)(</" + krSpDataDictionary.getParentNode()
+ "node>)(.*?)";

String nodes = "<node id='" + krSpDataDictionary.getNode()
+ "' name='" + krSpDataDictionary.getName() + "'></"
+ krSpDataDictionary.getNode() + "node>";

Pattern p = Pattern.compile(_regexp);
Matcher m = p.matcher(result);
boolean b = m.matches();

if (b) {
result = result.replaceAll(_regexp, "$1$2$3"+nodes+"$4$5");
} else {
result += nodes;
}

}

result += "</XML>";

result = result.replaceAll("</.*?node>", "</node>");

return result;
}

wenjjing2lianee 2010-01-18
  • 打赏
  • 举报
回复
up

//第一步,进行List排序,用来保证要创建的节点的父节点事先已经创建了。(比较关键)
this.sortKrSysModules(list);
mayuanfei 2010-01-18
  • 打赏
  • 举报
回复
呵呵。哥们你可真懒啊。我又给你改了一下

package org.quubox.com;

import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;
import org.jdom.xpath.XPath;

public class ListToXML {

//对外方法
public String list2xml(List<KrSysModule> list) throws Exception, IOException {
String xml = "";
if(list != null) {
//第一步,进行List排序,用来保证要创建的节点的父节点事先已经创建了。(比较关键)
this.sortKrSysModules(list);
//第二步,根据list生成XML
Document doc = this.buildXMLByList(list);
//第三步,生成字符串
xml = this.buildXMLString(doc);
}
return xml;
}
//生成字符串
private String buildXMLString(Document doc) throws IOException {
if(doc != null) {
Format format = Format.getPrettyFormat();
java.util.Properties sysProp = new java.util.Properties(System.getProperties());
String sysFileEncoding = sysProp.getProperty("file.encoding");//得到操作系统的编码
format.setEncoding(sysFileEncoding);//设置编码格式
XMLOutputter xmlout = new XMLOutputter(format);
ByteArrayOutputStream out = new ByteArrayOutputStream();
String xmlStr = null;
xmlout.output(doc,out);
xmlStr = out.toString();//将xml内容转化为字符串
return xmlStr;
}
return "";
}

//进行排序
private void sortKrSysModules(List<KrSysModule> list) {
if(list != null) {
Collections.sort(list, new Comparator() {
public int compare(Object o1,Object o2) {
KrSysModule kr1=(KrSysModule)o1;
KrSysModule kr2=(KrSysModule)o2;
return kr1.getParentNode().compareTo(kr2.getParentNode());
}
});
}
}

//通过List构建Document
private Document buildXMLByList(List<KrSysModule> list) throws JDOMException {
Element xml = new Element("xml");
Document doc = new Document(xml);
if(list != null) {
for(KrSysModule m : list) {
if(m.getParentNode().length()>0) {//有父节点
Element pNode = (Element) XPath.selectSingleNode(doc, "//node[@id='"+m.getParentNode()+"']");
if(pNode != null) {
Element sNode = new Element("node");
sNode.setAttribute("id", m.getNode());
sNode.setAttribute("name", m.getName());
pNode.addContent(sNode);
}
}else {//根节点
Element root = new Element("node");
root.setAttribute("id", m.getNode());
root.setAttribute("name", m.getName());
xml.addContent(root);
}
}
}
return doc;
}

//测试主方法
public static void main(String[] args) {
//生成测试数据
KrSysModule module0 = new KrSysModule();
module0.setNode("0");
module0.setName("根节点");
module0.setParentNode("");
KrSysModule module1 = new KrSysModule();
module1.setNode("0001");
module1.setName("节点1");
module1.setParentNode("0");
KrSysModule module2 = new KrSysModule();
module2.setNode("0001001");
module2.setName("节点11");
module2.setParentNode("0001");
KrSysModule module3 = new KrSysModule();
module3.setNode("0002");
module3.setName("节点2");
module3.setParentNode("0");
List<KrSysModule> list = new ArrayList<KrSysModule>();
list.add(module0);
list.add(module1);
list.add(module2);
list.add(module3);
//生成xml
ListToXML listToXml = new ListToXML();
try {
System.out.println(listToXml.list2xml(list));;
} catch (Exception e) {
e.printStackTrace();
}

}
}


输出如下:

<?xml version="1.0" encoding="UTF-8"?>
<xml>
<node id="0" name="根节点">
<node id="0001" name="节点1">
<node id="0001001" name="节点11" />
</node>
<node id="0002" name="节点2" />
</node>
</xml>
chen99xiao 2010-01-18
  • 打赏
  • 举报
回复
你改成生成字符串嘛!
jrosion 2010-01-18
  • 打赏
  • 举报
回复
呵呵,楼上的老大,,我要生成的是xml结构的字符串,不是文件,,不过我先看看你写的,,辛苦了。。
mayuanfei 2010-01-18
  • 打赏
  • 举报
回复
不好意思。哥们让你久等了。
第一步:下载JDOM包。下载地址:http://www.jdom.org/dist/binary/ 下载的是jdom-1.1.1.zip

第二步:解压后,把jdom/build下的jdom.jar和jdom/lib/jaxen.jar拷贝到你Eclipse项目中的libs下,并且加入到Build Path中。这个就不用我多说了吧。

第三步:KrSysModule的Bean。这个应该你有。

public class KrSysModule {
private String node ;
private String name;
private String parentNode;

public String getNode() {
return node;
}
public void setNode(String node) {
this.node = node;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getParentNode() {
return parentNode;
}
public void setParentNode(String parentNode) {
this.parentNode = parentNode;
}
}


第四步:生成XML文件。这里我默认生成到C盘根本下了,叫aa.xml。你可以自己更改。

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.output.XMLOutputter;
import org.jdom.xpath.XPath;

public class ListToXML {

//对外方法
public void list2xml(List<KrSysModule> list) throws Exception, IOException {
if(list != null) {
//第一步,进行List排序,用来保证要创建的节点的父节点事先已经创建了。(比较关键)
this.sortKrSysModules(list);
//第二步,根据list生成XML
Document doc = this.buildXMLByList(list);
//写出文件
XMLOutputter XMLOut = new XMLOutputter();
XMLOut.output(doc, new FileOutputStream("c:/aa.xml"));
}
}

//进行排序
private void sortKrSysModules(List<KrSysModule> list) {
if(list != null) {
Collections.sort(list, new Comparator() {
public int compare(Object o1,Object o2) {
KrSysModule kr1=(KrSysModule)o1;
KrSysModule kr2=(KrSysModule)o2;
return kr1.getParentNode().compareTo(kr2.getParentNode());
}
});
}
}

//通过List构建Document
private Document buildXMLByList(List<KrSysModule> list) throws JDOMException {
Element xml = new Element("xml");
Document doc = new Document(xml);
if(list != null) {
for(KrSysModule m : list) {
if(m.getParentNode().length()>0) {//有父节点
Element pNode = (Element) XPath.selectSingleNode(doc, "//node[@id='"+m.getParentNode()+"']");
if(pNode != null) {
Element sNode = new Element("node");
sNode.setAttribute("id", m.getNode());
sNode.setAttribute("name", m.getName());
pNode.addContent(sNode);
}
}else {//根节点
Element root = new Element("node");
root.setAttribute("id", m.getNode());
root.setAttribute("name", m.getName());
xml.addContent(root);
}
}
}
return doc;
}

//测试主方法
public static void main(String[] args) {
//生成测试数据
KrSysModule module0 = new KrSysModule();
module0.setNode("0");
module0.setName("根节点");
module0.setParentNode("");
KrSysModule module1 = new KrSysModule();
module1.setNode("0001");
module1.setName("节点1");
module1.setParentNode("0");
KrSysModule module2 = new KrSysModule();
module2.setNode("0001001");
module2.setName("节点11");
module2.setParentNode("0001");
KrSysModule module3 = new KrSysModule();
module3.setNode("0002");
module3.setName("节点2");
module3.setParentNode("0");
List<KrSysModule> list = new ArrayList<KrSysModule>();
list.add(module0);
list.add(module1);
list.add(module2);
list.add(module3);
//生成xml
ListToXML listToXml = new ListToXML();
try {
System.out.println("开始生成文件");
listToXml.list2xml(list);
System.out.println("生成文件完成");
} catch (Exception e) {
e.printStackTrace();
}

}
}
koma_wind 2010-01-18
  • 打赏
  • 举报
回复

private int level = 0;

public int getLevel() {
return level;
}

public void setLevel(int level) {
this.level = level;
}
/**
* 递归生成树算法
* @param list :查询出来的结果集
* @param father:父节点
* @param arraryList 新的结果集
*/
public void buildTree(List list, String father,ArrayList arraryList) {
for (int i = 0; i < list.size(); i++) {
HashMap map = (HashMap) list.get(i);
String Type_Parent_Id = (String) map.get("parentId");
String Type_Id = (String) map.get("id");
if (Type_Parent_Id.equals(father)) {
map.put("level", level);
arraryList.add((HashMap) list.get(i));
level++;
buildTree(list, Type_Id,arraryList);
}
}
level--;
}

数据库加一个level 字段,用来orderby
调用:
int level = 0;
Category cat = new Category();
ArrayList arraryList = new ArrayList();
List list = db.getCatList(conn,sql);
cat.setLevel(level);
cat.buildTree(list, "0",arraryList);

huangwj20042008 2010-01-18
  • 打赏
  • 举报
回复
基本思路是先建立一个map,再循环list,利用先前建立的map建立tree,最后递归这颗树,打印树的内容。
huangwj20042008 2010-01-18
  • 打赏
  • 举报
回复
public static String iterateNode(Node parent,int level){
StringBuilder builder = new StringBuilder();
int spaceNum = level*4;
for(int i=1;i<=spaceNum;i++){
builder.append(' ');
}
builder.append("<node name=\""+parent.name+"\">\n");
List<Node> childList = parent.childNodes;
int childSize = childList.size();
for(int i=0;i<childSize;i++){
Node childNode = childList.get(i);
builder.append(iterateNode(childNode,level+1));
}
builder.append("\n");
for(int i=1;i<=spaceNum;i++){
builder.append(' ');
}
builder.append("</node>\n");
return builder.toString();
}
}
class KrSysModule{
private String node ;
private String name;
private String parentNode;
public KrSysModule(String node,String name,String parentNode){
this.node = node;
this.name = name;
this.parentNode = parentNode;
}
public String getNode() {
return node;
}
public void setNode(String node) {
this.node = node;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getParentNode() {
return parentNode;
}
public void setParentNode(String parentNode) {
this.parentNode = parentNode;
}
}
class Node{
Node parentNode;
List<Node> childNodes = new ArrayList<Node>();
String name;
public Node(String name){
this.name = name;
}
public void addChild(Node childNode){
childNodes.add(childNode);
}
}
huangwj20042008 2010-01-18
  • 打赏
  • 举报
回复
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class ConvertPlaneToTree {
public static void main(String[] args){
ArrayList<KrSysModule> moduleList = new ArrayList<KrSysModule>();
moduleList.add(new KrSysModule("0","根节点",null));
moduleList.add(new KrSysModule("0001","节点1","0"));
moduleList.add(new KrSysModule("0001001"," 节点11","0001"));
moduleList.add(new KrSysModule("0002","节点2","0"));
HashMap<String,Node> idNodeMap = new HashMap<String,Node>();
int size = moduleList.size();
for(int i=0;i<size;i++){
KrSysModule tempModule = moduleList.get(i);
Node tempNode = new Node(tempModule.getName());
idNodeMap.put(tempModule.getNode(), tempNode);
}
Node root = null;
for(int i=0;i<size;i++){
KrSysModule tempModule = moduleList.get(i);
String parentName = tempModule.getParentNode();
if(parentName != null){
Node parentNode = idNodeMap.get(parentName);
String curName = tempModule.getNode();
Node curNode = idNodeMap.get(curName);
parentNode.childNodes.add(curNode);
curNode.parentNode = parentNode;
}else{
String curName = tempModule.getNode();
root = idNodeMap.get(curName);
}
}
System.out.println(iterateNode(root,1));

}
jrosion 2010-01-18
  • 打赏
  • 举报
回复
楼上的老大,,那是关于List的。
mayuanfei 2010-01-18
  • 打赏
  • 举报
回复
等着啊。哥们给你写一个
jrosion 2010-01-18
  • 打赏
  • 举报
回复
[size=16px][size=11px][/size][/size]
jrosion 2010-01-18
  • 打赏
  • 举报
回复
楼上的老大,,怎么样去解决呢。。
mayuanfei 2010-01-18
  • 打赏
  • 举报
回复
楼上写的很有问题。楼主说的是根据一个List生成XML。
psyuhen 2010-01-18
  • 打赏
  • 举报
回复
呵呵。。。我还发现呢。

就好像设计模式中的组合模式。

两者非常的相似。
psyuhen 2010-01-18
  • 打赏
  • 举报
回复
呵呵。。偶做了一下,实现了,不知对否:
节点类。

import java.util.ArrayList;
import java.util.List;
public class Node {
private String id;
private String name;
private Node parentNode;
List childList = new ArrayList();

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public Node getParentNode() {
return parentNode;
}

public void setParentNode(Node parentNode) {
this.parentNode = parentNode;
}

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}
public void addChild(Node child){
child.setParentNode(this);
childList.add(child);
}
public List getChildList(){
return childList;
}
}


实现类:

import java.util.Iterator;
import java.util.List;

public class Client {

/**
* @param args
*/
public static void main(String[] args) {
Node root = new Node();
root.setId("root");
root.setName("根节点");
root.setParentNode(null);
for(int i=0;i<10;i++){
Node node = new Node();
node.setId("0");
node.setName("node "+i);
root.addChild(node);
for(int j=0;j<10;j++){
Node node0 = new Node();
node0.setId(""+i+j);
node0.setName("node "+i+j);
node0.setParentNode(node);
node.addChild(node0);
}
}
//输出生成XML文档。
System.out.println("<XML>");
print(root);
System.out.println("</XML>");
}

public static void print(Node node){
System.out.println("<node name="+node.getName()+">");
List child = node.getChildList();
if(!child.isEmpty()){
Iterator it = child.iterator();
while(it.hasNext()){
print((Node)it.next());
}
}
System.out.println("</node>");
}
}

结果:
<XML>
<node name=根节点>
<node name=node 0>
<node name=node 00>
</node>
<node name=node 01>
</node>
<node name=node 02>
</node>
<node name=node 03>
</node>
<node name=node 04>
</node>
<node name=node 05>
</node>
<node name=node 06>
</node>
<node name=node 07>
</node>
<node name=node 08>
</node>
<node name=node 09>
</node>
</node>
<node name=node 1>
<node name=node 10>
</node>
<node name=node 11>
</node>
<node name=node 12>
</node>
<node name=node 13>
</node>
<node name=node 14>
</node>
<node name=node 15>
</node>
<node name=node 16>
</node>
<node name=node 17>
</node>
<node name=node 18>
</node>
<node name=node 19>
</node>
</node>
<node name=node 2>
<node name=node 20>
</node>
<node name=node 21>
</node>
<node name=node 22>
</node>
<node name=node 23>
</node>
<node name=node 24>
</node>
<node name=node 25>
</node>
<node name=node 26>
</node>
<node name=node 27>
</node>
<node name=node 28>
</node>
<node name=node 29>
</node>
</node>
<node name=node 3>
<node name=node 30>
</node>
<node name=node 31>
</node>
<node name=node 32>
</node>
<node name=node 33>
</node>
<node name=node 34>
</node>
<node name=node 35>
</node>
<node name=node 36>
</node>
<node name=node 37>
</node>
<node name=node 38>
</node>
<node name=node 39>
</node>
</node>
<node name=node 4>
<node name=node 40>
</node>
<node name=node 41>
</node>
<node name=node 42>
</node>
<node name=node 43>
</node>
<node name=node 44>
</node>
<node name=node 45>
</node>
<node name=node 46>
</node>
<node name=node 47>
</node>
<node name=node 48>
</node>
<node name=node 49>
</node>
</node>
<node name=node 5>
<node name=node 50>
</node>
<node name=node 51>
</node>
<node name=node 52>
</node>
<node name=node 53>
</node>
<node name=node 54>
</node>
<node name=node 55>
</node>
<node name=node 56>
</node>
<node name=node 57>
</node>
<node name=node 58>
</node>
<node name=node 59>
</node>
</node>
<node name=node 6>
<node name=node 60>
</node>
<node name=node 61>
</node>
<node name=node 62>
</node>
<node name=node 63>
</node>
<node name=node 64>
</node>
<node name=node 65>
</node>
<node name=node 66>
</node>
<node name=node 67>
</node>
<node name=node 68>
</node>
<node name=node 69>
</node>
</node>
<node name=node 7>
<node name=node 70>
</node>
<node name=node 71>
</node>
<node name=node 72>
</node>
<node name=node 73>
</node>
<node name=node 74>
</node>
<node name=node 75>
</node>
<node name=node 76>
</node>
<node name=node 77>
</node>
<node name=node 78>
</node>
<node name=node 79>
</node>
</node>
<node name=node 8>
<node name=node 80>
</node>
<node name=node 81>
</node>
<node name=node 82>
</node>
<node name=node 83>
</node>
<node name=node 84>
</node>
<node name=node 85>
</node>
<node name=node 86>
</node>
<node name=node 87>
</node>
<node name=node 88>
</node>
<node name=node 89>
</node>
</node>
<node name=node 9>
<node name=node 90>
</node>
<node name=node 91>
</node>
<node name=node 92>
</node>
<node name=node 93>
</node>
<node name=node 94>
</node>
<node name=node 95>
</node>
<node name=node 96>
</node>
<node name=node 97>
</node>
<node name=node 98>
</node>
<node name=node 99>
</node>
</node>
</node>
</XML>
加载更多回复(9)

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧