今天遇到个业务问题,原型上要求按省、市 进行层级划分返回仓库列表数据
仓库与仓库之间并没有上下级的关系,只是按省名称、市名称进行层级划分
新手程序员一时之间没想出来要怎么处理数据,然后我打开了ChatGpt试了试
我的提问:
public class WarehouseVO extends BaseVO { /** * 仓库名 */ @TableField("warehouse_name") private String warehouseName; /** * 省 */ @TableField("province") private String province; /** * 市 */ @TableField("city") private String city; /** * 详细地址 */ @TableField("detail_address") private String detailAddress;}
查询数据库得到的是,List<WarehouseVO>,构建出省、市层级划分的数据
ChatGpt4.0模型的回答:
构建一个省、市层级划分的数据结构,可以采用采用Java的Map结构来对数据进行组织。如果你拥有一个
List<WarehouseVO>
, 其中WarehouseVO
包含了省、市、详细地址等信息,那么你可以创建一个嵌套的Map(例如,一个省对应一个包含多个市的Map,每个市又对应一个包含多个仓库详细地址的列表)。以下是一个基本的Java示例代码,展示了如何从
List<WarehouseVO>
构建省市层级结构:Java 代码示例:
import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class Main { public static void main(String[] args) { // 模拟从数据库获取的数据 List<WarehouseVO> warehouses = new ArrayList<>(); warehouses.add(new WarehouseVO("Warehouse A", "Guangdong", "Shenzhen", "Nanshan")); warehouses.add(new WarehouseVO("Warehouse B", "Guangdong", "Guangzhou", "Tianhe")); warehouses.add(new WarehouseVO("Warehouse C", "Zhejiang", "Hangzhou", "Xihu")); // 使用 Map 嵌套结构组织数据 Map<String, Map<String, List<WarehouseVO>>> organizedData = new HashMap<>(); for (WarehouseVO warehouse : warehouses) { organizedData .computeIfAbsent(warehouse.getProvince(), k -> new HashMap<>()) .computeIfAbsent(warehouse.getCity(), k -> new ArrayList<>()) .add(warehouse); } // 输出查看结果 organizedData.forEach((province, cities) -> { System.out.println(province + ":"); cities.forEach((city, warehouseList) -> { System.out.println(" " + city + ":"); warehouseList.forEach(wh -> { System.out.println(" - " + wh.getWarehouseName() + ", " + wh.getDetailAddress()); }); }); }); } }
在这个例子中,我首先创建了一个示例数据列表,然后使用了Java 8的
Map.computeIfAbsent
方法来简洁地构建和维护数据结构。每个省份和城市作为键存储,在这个基础上列表存储具体的WarehouseVO
实例。这种层级结构使得数据在逻辑上易于理解和操作,并且在需要时,可以容易地根据省份或城市获取相关的仓库信息。这样的数据结构也便于实现例如基于省份或城市的筛选功能。
然后我去查看了对应方法的源码,看源码立马就明白了
完美解决问题,把代码写上去提交
@Override public Map<String, Map<String, List<WarehouseVO>>> getTree() { // 查询数据库得到仓库列表 List<WarehouseVO> warehouseVOList = this.list(); // 使用 Map 嵌套构建数据 Map<String, Map<String, List<WarehouseVO>>> organizedData = new HashMap<>(); for (WarehouseVO warehouseVO : warehouseVOList) { organizedData .computeIfAbsent(warehouseVO.getProvince(), k -> new HashMap<>()) .computeIfAbsent(warehouseVO.getCity(), k -> new ArrayList<>()) .add(warehouseVO); } // 返回数据 return organizedData; }
一个聪明的程序员都是善于使用工具的!