树形结构与层次结构相互转换
2016-07-09 14:22
381 查看
在层次遍历的基础上,保存层数信息即可
层次结构转换为树形结构(下一次链接在上一层的最后一个节点的特殊情况)
public void RTParseDirective(LinkedList<RuleTree> rts){ for(RuleTree rt: rts) { Directive dir = new Directive(); //场景头 dir.setId("16"); dir.setName("NAME:XXXXXXX"); dir.setPriority("2"); //节点的信息和层数 Stack<TwoTuple> st = new Stack<>(); st.push(new TwoTuple<>(rt, 0)); System.out.println(st.size()); LinkedList<LinkedList<XMLRuleNode>> Rule = dir.getXMLRule(); while (st.size() != 0) { if ((int) st.firstElement().second > Rule.size() - 1) { LinkedList<XMLRuleNode> newLevel = new LinkedList<>(); Rule.addLast(newLevel); } for (int i = 0; i < ((RuleTree) st.firstElement().first).getChildren().size(); i++) { System.out.println(i); st.push(new TwoTuple(((RuleTree) st.firstElement().first).getChildren().get(i), (int) st.firstElement().second + 1)); } Rule.get((int) st.firstElement().second).addLast(this.DirectiveNewRuleFromAlertInfo(((RuleTree) (st.firstElement().first)).getAlertInfo())); st.remove(0); } this.directives.add(dir); } }
层次结构转换为树形结构(下一次链接在上一层的最后一个节点的特殊情况)
package hznu.sun.ruleming.function.rule.updateDirective; import hznu.sun.ruleming.pojo.Directive; import hznu.sun.ruleming.pojo.XMLRuleNode; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.io.OutputFormat; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; import java.io.FileWriter; import java.util.Iterator; import java.util.LinkedList; /** * Created by sun on 2016/7/11. */ public class writeDirectiveToXML { private final static Integer UPDATE = 0;//update rule private final static Integer NEW = 1;//new rule private final String needUpdatefilename = "Rule/newRulematched.xml"; private final String newRulefilename = "Rule/newRuleNotmatched.xml"; private Document doc; /** * write Directive to *.xml <br/> * 1、add directive<br/> * 2、add next level to last level's last elemt<br/> * 3、write to *.xml by NEWorUPDAT * @param directive * @param NEWorUPDATE write to diffirent xml */ public void create(Directive directive,Integer NEWorUPDATE){ try { SAXReader reader = new SAXReader(); if(NEWorUPDATE.equals(NEW)) doc = reader.read(newRulefilename); else doc = reader.read(needUpdatefilename); Element root = doc.getRootElement();//get root //get classification for (Iterator i = root.elementIterator(); i.hasNext();) { Element element = (Element) i.next(); if (element.getName().equals("classification")) { //add first level Element edirective = element.addElement("directive"). addAttribute("id", directive.getId()). addAttribute("name", directive.getName()). addAttribute("priority", directive.getPriority()); LinkedList<LinkedList<XMLRuleNode>> xnodes = directive.getXMLRule(); for (int ifir = 0 ; ifir <xnodes.getFirst().size() ; ifir ++ ) { if(ifir == xnodes.getFirst().size() - 1){ // the Element 'child' is used for recor 4000 d the last ruleElement Element child = this.addruleInfo(edirective, xnodes.getFirst().get(ifir)); //add 'rules' (the next levels) for(int ixnodes = 1 ; ixnodes < xnodes.size(); ixnodes ++){ child = this.addrulesinfo(child); for(int ix = 0 ; ix <xnodes.get(ixnodes).size(); ix ++ ){ if(ix == xnodes.get(ixnodes).size() - 1){ child = this.addruleInfo(child, xnodes.get(ixnodes).get(ix)); }else { this.addruleInfo(child, xnodes.get(ixnodes).get(ix)); } } } }else { this.addruleInfo(edirective, xnodes.getFirst().get(ifir)); } } } } OutputFormat format = new OutputFormat(); format.setNewlines(true); XMLWriter output ; if(NEW.equals(NEWorUPDATE)){ output = new XMLWriter(new FileWriter(newRulefilename),format); } else{ output = new XMLWriter(new FileWriter(needUpdatefilename)); } output.write(doc); output.close(); } catch (Exception e) { e.printStackTrace(); System.err.println("could not parse the file!"); } } /** * add child element 'rule' to the element * @param e * @param xmlRuleNode * @return Element return the child element 'rule' */ private Element addruleInfo(Element e, XMLRuleNode xmlRuleNode) { Element element = DocumentHelper.createElement("rule"); element.addAttribute("id", xmlRuleNode.getId()). addAttribute("type", xmlRuleNode.getType()). addAttribute("name", xmlRuleNode.getName()). addAttribute("reliability", xmlRuleNode.getReliability()). addAttribute("from", xmlRuleNode.getFrom()). addAttribute("to", xmlRuleNode.getTo()). addAttribute("port_from", xmlRuleNode.getPort_from()). addAttribute("port_to", xmlRuleNode.getPort_to()). addAttribute("plugin_id", xmlRuleNode.getPlugin_id()). addAttribute("plugin_sid", xmlRuleNode.getPlugin_sid()). addAttribute("protocol", xmlRuleNode.getProtocol()); e.add(element); return element; } /** * add 'rules' * @param e * @return get the child 'rules' */ private Element addrulesinfo(Element e) { Element element = DocumentHelper.createElement("rules"); e.add(element); return element; } public static void main(String[] args) { Directive directive = new Directive(); directive.setName("nihao"); directive.setId("9999"); directive.setPriority("9999"); LinkedList<LinkedList<XMLRuleNode>> rule = new LinkedList<>(); LinkedList<XMLRuleNode> l1 = new LinkedList<>(); LinkedList<XMLRuleNode> l2 = new LinkedList<>(); LinkedList<XMLRuleNode> l3 = new LinkedList<>(); XMLRuleNode xmlRuleNode = new XMLRuleNode(); xmlRuleNode.setId("11"); xmlRuleNode.setName("xx"); xmlRuleNode.setPlugin_sid("ss"); xmlRuleNode.setFrom("ss"); l1.add(xmlRuleNode); l2.add(xmlRuleNode); l2.add(xmlRuleNode); l3.add(xmlRuleNode); l3.add(xmlRuleNode); l3.add(xmlRuleNode); rule.addFirst(l1); rule.addLast(l2); rule.addLast(l2); directive.setXMLRule(rule); new writeDirectiveToXML().create(directive ,UPDATE); } }
相关文章推荐
- C#数据结构之顺序表(SeqList)实例详解
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#数据结构之单链表(LinkList)实例详解
- 数据结构之Treap详解
- 用C语言举例讲解数据结构中的算法复杂度结与顺序表
- C#数据结构之堆栈(Stack)实例详解
- C#数据结构之双向链表(DbLinkList)实例详解
- JavaScript数据结构和算法之图和图算法
- Java数据结构及算法实例:冒泡排序 Bubble Sort
- Java数据结构及算法实例:插入排序 Insertion Sort
- Java数据结构及算法实例:考拉兹猜想 Collatz Conjecture
- java数据结构之java实现栈
- java数据结构之实现双向链表的示例
- Java数据结构及算法实例:选择排序 Selection Sort
- Java数据结构及算法实例:朴素字符匹配 Brute Force
- Java数据结构及算法实例:汉诺塔问题 Hanoi
- Java数据结构及算法实例:快速计算二进制数中1的个数(Fast Bit Counting)