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; // 行政区idprivate String districtName; // 行政区名称private String parentId; // 父idprivate 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;}
}