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>

当然节点的子节点没有限制。。
...全文
517 30 打赏 收藏 转发到动态 举报
写回复
用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)
16进制10进制.txt 32.txt asm.txt Crctable.txt C标志符命名源程序.txt erre.txt erre2.txt ff.txt for循环的.txt list.log N皇后问题回溯算法.txt ping.txt re.txt source.txt winsock2.txt ww.txt 万年历.txt 万年历的算法 .txt 乘方函数桃子猴.txt 乘法矩阵.txt 二分查找1.txt 二分查找2.txt 二叉排序树.txt 二叉树.txt 二叉树实例.txt 二进制数.txt 二进制数2.txt 余弦曲线.txt 余弦直线.txt 傻瓜递归.txt 冒泡排序.txt 冒泡法改进.txt 动态计算网络最长最短路线.txt 十五人排序.txt 单循环链表.txt 单词倒转.txt 单链表.txt 单链表1.txt 单链表2.txt 单链表倒序.txt 单链表的处理全集.txt 双链表正排序.txt 反出字符.txt 叠代整除.txt 各种排序法.txt 哈夫曼算法.txt 哈慢树.txt 四分砝码.txt 四塔1.txt 四塔2.txt 回文.txt 图.txt 圆周率.txt 多位阶乘.txt 多位阶乘2.txt 大加数.txt 大小倍约.txt 大整数.txt 字符串查找.txt 字符编辑.txt 字符编辑技术(插入和删除) .txt 完数.txt 定长串.txt 实例1.txt 实例2.txt 实例3.txt 小写数字转换成大写数字1.txt 小写数字转换成大写数字2.txt 小写数字转换成大写数字3.txt 小字库DIY-.txt 小字库DIY.txt 小孩分糖果.txt 小明买书.txt 小白鼠钻迷宫.txt 带头结点双链循环线性表.txt 平方根.txt 建树和遍历.txt 建立链表1.txt 扫描码.txt 挽救软盘.txt 换位递归.txt 排序法.txt 推箱子.txt 数字移动.txt 数据结构.txt 数据结构2.txt 数据结构3.txt 数组完全单元.txt 数组操作.txt 数组递归退出.txt 数组递归退出2.txt 文件加密.txt 文件复制.txt 文件连接.txt 无向图.txt 时间陷阱.txt 杨辉三角形.txt 栈单元加.txt 栈操作.txt 桃子猴.txt 桶排序.txt 检出错误.txt 检测鼠标.txt 汉字字模.txt 汉诺塔.txt 汉诺塔2.txt 灯塔问题.txt 猴子和桃.txt 百鸡百钱.txt 矩阵乘法动态规划.txt 矩阵转换.txt 硬币分法.txt 神经元模型.txt 穷举搜索法.txt 符号图形.txt 简单数据库.txt 简单计算器.txt 简单逆阵.txt 线性顺序存储结构.txt 线索化二叉树.txt 绘制圆.txt 编随机数.txt 网络最短路径Dijkstra算法.txt 自我复制.txt 节点.txt 苹果分法.txt 螺旋数组1.txt 螺旋数组2.txt 试题.txt 诺汉塔画图版.txt 读写文本文件.txt 货郎担分枝限界图形演示.txt 货郎担限界算法.txt 质因子.txt 输出自已.txt 迷宫.txt 迷宫问题.txt 逆波兰计算器.txt 逆矩阵.txt 逆阵.txt 递堆法.txt 递归桃猴.txt 递归车厢.txt 递推.txt 逻辑移动.txt 链串.txt 链栈.txt 链表十五人排序.txt 链表(递归).txt 链队列.txt 队列.txt 阶乘递归.txt 阿姆斯特朗数.txt 非递归.txt 顺序栈.txt 顺序表.txt 顺序队列.txt 骑士遍历1.txt 骑士遍历2.txt 骑士遍历回逆.txt 黑白.txt

62,610

社区成员

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

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