以目录形式存树结构,用json lib拼接,用easyui显示(例子)

1 篇文章 0 订阅

从网上找的资料来看,目前保存树的有三种方法: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控件,效果为:



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值