JAVA中如何通过TreeMap存储的Car对象model属性查询对应key
问题原因
Java 标准库的TreeMap没有内置通过值的成员属性反向查询对应键的方法,你写的list.getKey(model)无法运行:一是TreeMap本身没有getKey这个API,二是你的TreeMap键类型为Integer,和要查询的model字符串类型不匹配,必须自行遍历匹配实现。
前置修正
你定义的Car类写法存在语法错误,且需要补充成员变量的getter方法才能正常访问属性,修正后代码如下:
public class Car { String model; String brand; Integer yearReleased; float price; // 补充model属性的get方法 public String getModel() { return model; } }
实现方案
1. Java 8+ 流式写法(推荐)
返回第一个匹配的键
import java.util.Optional; import java.util.TreeMap; public Optional<Integer> searchModel(TreeMap<Integer, Car> cars, String targetModel) { return cars.entrySet().stream() .filter(entry -> targetModel.equals(entry.getValue().getModel())) .map(entry -> entry.getKey()) .findFirst(); }
调用时如果找不到匹配会返回空的Optional,可以避免空指针异常。
返回所有匹配的键(兼容多辆同model车辆场景)
import java.util.List; import java.util.TreeMap; import java.util.stream.Collectors; public List<Integer> searchAllModelKeys(TreeMap<Integer, Car> cars, String targetModel) { return cars.entrySet().stream() .filter(entry -> targetModel.equals(entry.getValue().getModel())) .map(entry -> entry.getKey()) .collect(Collectors.toList()); }
2. 低版本Java 遍历写法
import java.util.TreeMap; import java.util.Map.Entry; public Integer searchModel(TreeMap<Integer, Car> cars, String targetModel) { for (Entry<Integer, Car> entry : cars.entrySet()) { if (targetModel.equals(entry.getValue().getModel())) { return entry.getKey(); } } // 无匹配返回null return null; }
优化建议
如果需要频繁执行这种反向查询,可以额外维护一个Map<String, List<Integer>> modelToKeys的映射关系,新增/删除Car时同步更新这个映射,查询时可以直接O(1)拿到结果,避免每次遍历全量数据,性能提升明显。
内容的提问来源于stack exchange,提问作者rr11
相关产品推荐
相关产品推荐

