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;
}
}
问题解答2024年4月28日
于 2024-04-28 13:58:41 首次发布