问题解答2024年4月28日

本文介绍了一个Java程序,通过定义`District`类和`Solution`类,实现了一个服务接口,根据行政区ID查询并以树形结构返回包含当前行政区及其子区域的列表,使用了深度优先搜索算法(Stack实现)来遍历数据库数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import java.util.ArrayList;
import java.util.List;
import java.util.Stack;



//现有数据库里保存有行政区数据, 一个行政区是一行数据,包括行政区id,行政区名称,行政区父id。 比如:
//
//行政区ID,   行政区名称, 行政区父ID  
//1,             中国,            null
//2,             浙江省,         1
//3,                杭州市,         2
//4,                余杭区,            3
//
//
//要求编写一个服务接口,入参:行政区id,出参:树结构形式,包括当前行政区以及所有子行政区。
//
//比如入参是2,返回:
//浙江省
//-- 杭州市
//   -- 余杭区
//
//比如入参是1,返回:
//中国
//-- 浙江省
//  -- 杭州市
//     -- 余杭区
//
//比如入参是3,返回:
//杭州市
//-- 余杭区
public class Main {
    public static void main(String[] args) {
    	// 数据模拟
    	List<District> districtList = new ArrayList<District>();
    	districtList.add(new District("1", "中国", null));
    	
    	districtList.add(new District("2", "浙江省", "1"));
    	
    	districtList.add(new District("3", "杭州市", "2"));
    	districtList.add(new District("4", "湖州市", "2"));
    	districtList.add(new District("5", "嘉兴市", "2"));
    	districtList.add(new District("6", "绍兴市", "2"));
    	
    	districtList.add(new District("7", "余杭区", "3"));
    	districtList.add(new District("8", "上城区", "3"));
    	districtList.add(new District("9", "钱塘区", "3"));
    	districtList.add(new District("10", "滨江区", "3"));
    	Solution solution = new Solution(districtList);
    	
    	// 查询
    	String districtId = "2";
    	solution.getInfo(districtId);
    }
}

class Solution {
	private List<District> districtList;
	
	public Solution(List<District> districtList) {
		this.districtList = districtList;
	}
	
	public void getInfo(String districtId) {
		// 设计思路,按照行政区获取数据的方式,以深度优先搜索为主(用stack实现),优先显示子节点
		// 数据放在list中,通过遍历的方式查询,模拟数据库查询

		int level = 1;  // 每一层的缩进控制
		
		Stack<District> stack = new Stack<District>();
		District district = getDistrictsById(districtId);
		if (district != null) {
			district.setLevel(level);
			
			stack.push(district);
			while (!stack.isEmpty()) {
				
				District district2 = stack.pop();
//				System.out.println(district2.getLevel() + " " + district2.getDistrictName());
				System.out.println(String.format("%0" + district2.getLevel() + "d", 0).replace("0", " ") + " --" + district2.getDistrictName());
				
				List<District> childList = getDistrictsByParentId(district2.getDistrictId());
				
				level++;
				for (District district3 : childList) {
					district3.setLevel(level);
					stack.push(district3);
				}
			}
			
		}
	}
	
	// 根据id查找本级数据
	District getDistrictsById(String districtId) {
		for (int i = 0; i < districtList.size(); i++) {
			District district = districtList.get(i);
			if (district.getDistrictId() == districtId) {
				return district;
			}
		}
		return null;
	}
	// 相当于根据一个父节点,查出一层的数据
	List<District> getDistrictsByParentId(String parentId) {
		// 模拟数据库查询
		List<District> districtResult = new ArrayList<District>();
		for (int i = 0; i < districtList.size(); i++) {
			District district = districtList.get(i);
			if (district.getParentId() == parentId) {
				districtResult.add(district);
			}
		}
		return districtResult;
	}
}

// 行政区的类设计
class District {
	private String districtId;  // 行政区id
	private String districtName;  // 行政区名称
	private String parentId;   // 父id
	
	private int level;  // 临时控制每一层的缩进
	
	public District(String districtId, String districtName, String parentId) {
		this.districtId = districtId;
		this.districtName = districtName;
		this.parentId = parentId;
	}
	
	
	
	public String getDistrictId() {
		return districtId;
	}
	public void setDistrictId(String districtId) {
		this.districtId = districtId;
	}
	public String getDistrictName() {
		return districtName;
	}
	public void setDistrictName(String districtName) {
		this.districtName = districtName;
	}
	public String getParentId() {
		return parentId;
	}
	public void setParentId(String parentId) {
		this.parentId = parentId;
	}
	public int getLevel() {
		return level;
	}
	public void setLevel(int level) {
		this.level = level;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值