小明给的
/**
*
* 树使用的工具
*
* @author Zhang Ming
* @version Ver 1.0 2011-03-19 初版
*
*/
package com.ctg.utils.tree
{
import mx.collections.ArrayCollection;
import mx.utils.ObjectUtil;
public class TreeUtil
{
public function TreeUtil()
{
}
public static function arrayToXML(mainArray:Array, subArray:Array = null, keyField:String = null):XMLList{
var xmlList:XMLList;
var tool:ArrayToXMLTool = new ArrayToXMLTool();
var opritionArray:Array = ObjectUtil.copy(mainArray) as Array;
var rootClassinfo:Object = ObjectUtil.getClassInfo(opritionArray);
var xmlString:String = "";
if(subArray != null && keyField != null){
opritionArray = tool.mainArrayConnectionSubArray(opritionArray, subArray, keyField);
}
xmlString += tool.arrayToXMLString(opritionArray);
xmlList = new XMLList(xmlString);
return xmlList;
}
}
}
class ArrayToXMLTool{
import mx.collections.ArrayCollection;
import mx.utils.ObjectUtil;
public function mainArrayConnectionSubArray(mainArray:Array, subArray:Array = null, keyField:String = null):Array{
var array:Array = new Array();
if(keyField == null) return array;
for each(var main:Object in mainArray){
var mainClassinfo:Object = ObjectUtil.getClassInfo(main);
var obj:Object = new Object();
for each(var p:* in mainClassinfo.properties){
obj[p] = main[p];
if(obj[p] is Array){
obj[p] = mainArrayConnectionSubArray(obj[p], subArray, keyField);
break;
} else if(obj[p] is ArrayCollection){
obj[p] = mainArrayConnectionSubArray(obj[p].source, subArray, keyField);
break;
}
}
for each(var sub:Object in subArray){
if(obj[keyField] != null && sub[keyField] == obj[keyField]){
if(obj['zzzz'] == null) obj['zzzz'] = new Array();
obj['zzzz'].push(sub);
}
}
array.push(obj);
}
array.sort(compareFunction);
return array;
}
private function typeToInt(obj:Object):int{
var typeInt:int = 0;
var classinfo:Object = ObjectUtil.getClassInfo(obj);
for each(var p:* in classinfo.properties){
if(obj[p] is Array){
if(obj[p]!= null && obj[p].length > 0) typeInt = 1;
break;
} else if(obj[p] is ArrayCollection){
if(obj[p]!= null && obj[p].length > 0) typeInt = 1;
break;
}
}
return typeInt;
}
private function compareFunction(obj1:Object, obj2:Object):int{
var a:int = typeToInt(obj1);
var b:int = typeToInt(obj2);
if(a>b){
return -1;
} else if(a==b){
return 0;
} else if(a<b){
return 1;
}
return 0;
}
public function arrayToXMLString(array:Array):String{
var xmlString:String = "";
for each(var main:* in array){
var mainClassinfo:Object = ObjectUtil.getClassInfo(main);
xmlString += "<" + "node" + " ";
var stringArray:Array = new Array();
for each(var p:* in mainClassinfo.properties){
if(main[p] is Array){
stringArray.push(arrayToXMLString(main[p]));
} else if(main[p] is ArrayCollection){
stringArray.push(arrayToXMLString(main[p].source));
} else {
xmlString += p.localName + "='" + (main[p]==null?"":main[p]) + "' ";
}
}
xmlString += ">\n" ;
for each(var string:String in stringArray){
xmlString += string;
}
xmlString += "</" + "node" + ">\n";
}
return xmlString;
}
private function getSubArray(object:Object):Array{
return null;
}
}
分享到:
相关推荐
写递归函数,可考虑缓存,定义一些静态变量来存上一次运行的结果,多...大概步骤如下:首先到数据库取数据,放到一个数组,然后把数据转化为一个树型状的数组,最后把这个树型状的数组转为html代码。下面我们来看个实例
- **Kruskal算法**:Kruskal算法是另一种寻找最小生成树的贪心算法。它按边的权值从小到大添加边,但要确保添加的边不会形成环路。 ```pascal procedure kruskal; var tot, i, j: integer; begin // ......
lowcost, closest: array[1..maxn] of integer; i, j, min, k: integer; begin // 初始化... // 构建最小生成树... end; // Kruskal算法简化版 procedure kruskal; var tot, i, j: integer; best, best_j: ...
Kruskal算法同样用于寻找最小生成树,但采用排序边集的方式,按边权值递增顺序加入不构成环的边。 ```pascal procedure kruskal; var tot, i, j: integer; begin // 将边按照权值排序 // ... // 依次加入不构成...
2. **排序**:利用C#的`Array.Sort`或`List.Sort`方法对边进行排序。 3. **并查集**:可实现一个并查集类,包含`Find`和`Union`等方法。 4. **优先队列**:C#的`System.Collections.Generic.PriorityQueue`可以方便...
- **后缀数组 (Suffix Array)** - 定义:字符串所有后缀按字典序排序的结果。 - **左偏树 (Left-Leaning Red-Black Tree)** - 定义:一种自平衡的二叉搜索树。 - **标准RMQ-ST (Range Minimum Query on Segment ...
应用:如在设计通信网络时,用图的顶点表示城市,用边(v,w)的权 c[v,w]表示建立城市 v、w 之间的通信线路所需的费用,则最小生成树就给出了建立通信网络最经济的方案。 三、Prim算法 Prim 算法思想:任意时刻的...
3. 动态规划:动态规划是一种解决复杂问题的有效方法,通过将大问题分解为小问题,然后逐步构建最优解。题目ZJU1558和ZJU1107都是关于动态规划的题目,难度分别为“比较简单”和“中等偏难”。 4. 博弈问题:博弈论...
- 最短路径算法用于计算图中两点之间的最短路径,而最小生成树算法用于找出连接图中所有顶点的最小代价的无环连通子图。 4. 散列结构算法:包括直接定址法、除留余数法、平方取中法等散列函数的设计,以及开放寻址...
Kruskal算法同样用于寻找最小生成树,但它是基于贪心策略的算法。 ```pascal function find(v: integer): integer; var i: integer; begin i := 1; while (i ) and (not vin vset[i]) do inc(i); if i ...
ES6的`Array.prototype.sort()`方法可以配合自定义比较函数实现。 3. **遍历边**:按照排序顺序遍历边,对于每一条边`(u, v)`: - 检查`u`和`v`是否已经在最小生成树集中形成环。这里可以利用`Set`存储已访问的...
在JavaScript中,我们可以使用`Array`对象作为队列,用`push`方法添加元素到队列末尾,用`shift`方法移除并返回队首元素。下面是一个简单的BFS函数实现,用于遍历一个表示图的邻接矩阵: ```javascript function ...
文件中还提到了一种求解单源点最短路径的方法——标号法,但由于提供的代码片段不完整,无法完全展示其实现细节。标号法的基本思想是从起点出发,逐步更新其他顶点的距离标签,直到所有顶点的距离标签不再发生变化...
ACM算法试题集是面向计算机编程竞赛,尤其是ACM国际大学生程序...这些内容几乎涵盖了ACM算法竞赛中可能遇到的所有问题类型和解题方法。掌握这些内容对于提升编程能力、解决复杂算法问题以及准备ACM算法竞赛至关重要。