从网上找的资料来看,目前保存树的有三种方法:1.子节点保存父节点编号。2.用数字形式,例如10是个节点,那么1000-1099都是子节点,同理100000-100099都是1000的子节点。3.用目录格式来保存。
因为确定使用easyui的树形结构,而且项目中已经引入了json lib,所以综合目录格式的清晰来考虑决定用目录格式。
遇到的最大的问题是JSONArray和JSONObject,开始没有对json很深入的了解,花了比较多的时间去转化,但是发现了个问题。
先看一段代码:
import java.util.*;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
public class MultipleTree {
public static void main(String[] args) {
JSONArray result = new JSONArray();
JSONObject temp_for_add = new JSONObject();
temp_for_add.put("text", "aaa");
temp_for_add.put("children", new JSONArray());
JSONObject temp = new JSONObject();
temp.put("test1", "test1_data");
temp_for_add.getJSONArray("children").add(temp);
result.add(temp_for_add);//注意这句话
System.out.println(result.toString());
}
}
打印结果是 [{"text":"aaa","children":[{"test1":"test1_data"}]}]
第二段代码:
import java.util.*;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
public class MultipleTree {
public static void main(String[] args) {
JSONArray result = new JSONArray();
JSONObject temp_for_add = new JSONObject();
temp_for_add.put("text", "aaa");
temp_for_add.put("children", new JSONArray());
result.add(temp_for_add);//注意这句话
JSONObject temp = new JSONObject();
temp.put("test1", "test1_data");
temp_for_add.getJSONArray("children").add(temp);
System.out.println(result.toString());
}
}
打印结果是:[{"text":"aaa","children":[]}]
可以看到在add之后对被加入的JSONObject对象put就似乎没有作用了,暂时还是不明白为什么会出现这样的情况,由于是从根节点往下加的,所以考虑放弃先ADD再put,要将顺序反过来就用了递归。
import java.util.*;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
public class MultipleTree {
static JSONArray makeMultipleTree(String[] mm, JSONArray result, int i){
JSONObject temp_for_add = new JSONObject();
int flag = -1;//如果处理后是-1说明没有相同的节点
for(int ii =0; ii<result.size(); ii++ ) {
if(result.getJSONObject(ii).containsValue(mm[i])){
flag = ii;//如果处理后是ii,就说明m[ii]已经有了
}
}
JSONArray temp;
if(flag==-1){//如果节点未添加,就添加
temp_for_add.put("text", mm[i]);//注意这句话
temp_for_add.put("children", new JSONArray());//注意这句话
if(i >= mm.length-1){
result.add(temp_for_add);
return result;
}
temp = makeMultipleTree(mm, temp_for_add.getJSONArray("children"), ++i);
result.add(temp_for_add);//注意这句话
}else{//如果节点已添加,就接下去算
temp = makeMultipleTree(mm, result.getJSONObject(flag).getJSONArray("children"), ++i);
}
return temp;
}
public static void main(String[] args) {
String data1 = "result/go/hi";
String data2 = "result/go/hi/kk";
String data3 = "result/go/dd";
String data4 = "result/aa/hi";
String data5 = "result/dd/hi";
String data6 = "result/ff/gg/eek";
String[] array = data1.split("/");
JSONArray result = new JSONArray();
makeMultipleTree(array, result, 0);
array = data2.split("/");
makeMultipleTree(array, result, 0);
array = data3.split("/");
makeMultipleTree(array, result, 0);
array = data4.split("/");
makeMultipleTree(array, result, 0);
array = data5.split("/");
makeMultipleTree(array, result, 0);
array = data6.split("/");
makeMultipleTree(array, result, 0);
System.out.println(result.toString());
}
}
可以看到因为递归所以put可以放在ADD之前,因此makeMultipleTree可以用。
打印结果是[{"text":"result","children":[{"text":"go","children":[{"text":"hi","children":[{"text":"kk","children":[]}]},{"text":"dd","children":[]}]},{"text":"aa","children":[{"text":"hi","children":[]}]},{"text":"dd","children":[{"text":"hi","children":[]}]},{"text":"ff","children":[{"text":"gg","children":[{"text":"eek","children":[]}]}]}]}]
可以直接用于easyui的tree控件,效果为: