java中怎么生成一個(gè)樹(shù)形結(jié)構(gòu)

java 中怎么生成一個(gè)樹(shù)形結(jié)構(gòu),很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。

站在用戶的角度思考問(wèn)題,與客戶深入溝通,找到新化網(wǎng)站設(shè)計(jì)與新化網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類(lèi)型包括:成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、空間域名、雅安服務(wù)器托管、企業(yè)郵箱。業(yè)務(wù)覆蓋新化地區(qū)。

樹(shù)形結(jié)構(gòu)是非常常見(jiàn)的數(shù)據(jù)結(jié)構(gòu),生成樹(shù)形結(jié)構(gòu)的方法比較常見(jiàn)的有遞歸,for循環(huán),不管使用什么方法,如果能很好地利用內(nèi)存來(lái)合理地添加樹(shù)節(jié)點(diǎn),則能極大提高效率

測(cè)試代碼如下:

public class TestTree {
	
	public static void main(String[] args) {
		C3p0Jdbc jdbc = new C3p0Jdbc();
		String sql = "SELECT code value,up_code upCode,name label,level FROM test_table WHERE level < 4 ORDER BY level";
		JSONArray arr = jdbc.query(sql);
		// 先將數(shù)據(jù)循環(huán)放入新建的map中
		Map<String, JSONObject> treeMap = new HashMap<>();
		int length = arr.size();
		long t1 = System.currentTimeMillis();
		for (int i = 0; i < length; i++) {
			String key = arr.getJSONObject(i).getString("value");
			treeMap.put(key, arr.getJSONObject(i));
		}
		long t2 = System.currentTimeMillis();
		System.out.println("循環(huán)用時(shí):" + (t2 - t1) + "ms");
		JSONArray new_tree = new JSONArray();
		// 再使用雙層for循環(huán),根據(jù)判斷條件,將符合條件的節(jié)點(diǎn)數(shù)據(jù)添加到樹(shù)形結(jié)構(gòu)中
		for (int i = 0; i < length; i++) {
			JSONObject parent = arr.getJSONObject(i);
			String key = parent.getString("value");
			int level = parent.getIntValue("level");
			// 這是唯一一處需要 new 對(duì)象的地方
			JSONArray children = new JSONArray();
			for (int j = 0; j < length; j++) {
				JSONObject child = arr.getJSONObject(j);
				String childKey = child.getString("value");
				String upCode = child.getString("upCode");
				if (upCode.equals(key)) {
					children.add(treeMap.get(childKey));
				}
			}
			parent.put("children", children);
			if (level == 1) {
				new_tree.add(parent);
			}
		}
		
		long t3 = System.currentTimeMillis();
		System.out.println("第二次遍歷用時(shí):" + (t3 - t2) + "ms");
		System.out.println("全過(guò)程用時(shí):" + (t3 - t1) + "ms");
	}
	
}

在for循環(huán)中務(wù)必要減少new 對(duì)象的次數(shù),New 對(duì)象是很耗時(shí)的操作,不僅僅是 new 對(duì)象會(huì)很耗時(shí),其它操作比如將一個(gè) object 轉(zhuǎn)為 jsonarray 或 json 也會(huì)很耗時(shí),因?yàn)檫@種操作修改了內(nèi)存中對(duì)象的引用地址,測(cè)試代碼中最優(yōu)勢(shì)的地方就是將所有的對(duì)象都加載到map中,在new_tree.add(parent)的操作時(shí)是直接將parent對(duì)象的內(nèi)存引用地址添加到了new_tree中,所以效率非???,我的測(cè)試數(shù)據(jù)是3227條國(guó)內(nèi)的省市區(qū)縣數(shù)據(jù),全過(guò)程用時(shí)在600~850 ms之間 效果如圖:

java 中怎么生成一個(gè)樹(shù)形結(jié)構(gòu)

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對(duì)創(chuàng)新互聯(lián)的支持。

分享名稱:java中怎么生成一個(gè)樹(shù)形結(jié)構(gòu)
文章出自:http://muchs.cn/article6/ijdhog.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站、搜索引擎優(yōu)化、網(wǎng)站建設(shè)、移動(dòng)網(wǎng)站建設(shè)建站公司、App開(kāi)發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

營(yíng)銷(xiāo)型網(wǎng)站建設(shè)