Java中筛选ArrayList中满足多范围条件对象的实现方法
基于多范围条件筛选City对象的实现方案
嘿,这个多条件范围筛选的需求其实不难实现,咱们一步步来搞定它!
首先,我们需要一个条件类来封装每个字段(total/men/women)的范围规则,这样可以灵活定义任意数量的筛选条件:
// 封装单个字段的范围筛选条件 public class CityCondition { private String field; // 目标字段:"total"、"men"或"women" private Integer min; // 范围下限(null表示无下限) private Integer max; // 范围上限(null表示无上限) // 构造器 public CityCondition(String field, Integer min, Integer max) { this.field = field; this.min = min; this.max = max; } // Getter方法(必须,因为City类的字段是private的) public String getField() { return field; } public Integer getMin() { return min; } public Integer getMax() { return max; } }
接下来,我们编写核心的筛选方法。这里用Java Stream API来实现,代码更简洁优雅,也方便后续扩展:
import java.util.List; import java.util.stream.Collectors; public class CityFilter { // 主方法:接收City列表和条件列表,返回符合所有条件的City public List<City> filterCities(List<City> cities, List<CityCondition> conditions) { return cities.stream() .filter(city -> matchesAllConditions(city, conditions)) .collect(Collectors.toList()); } // 辅助方法:检查单个City是否满足所有条件 private boolean matchesAllConditions(City city, List<CityCondition> conditions) { for (CityCondition condition : conditions) { int fieldValue = getFieldValue(city, condition.getField()); // 检查下限:如果min不为null,字段值必须大于等于min if (condition.getMin() != null && fieldValue < condition.getMin()) { return false; } // 检查上限:如果max不为null,字段值必须小于等于max if (condition.getMax() != null && fieldValue > condition.getMax()) { return false; } } return true; } // 辅助方法:根据字段名获取City对应的数值 private int getFieldValue(City city, String field) { return switch (field.toLowerCase()) { case "total" -> city.getTotal(); case "men" -> city.getMen(); case "women" -> city.getWomen(); default -> throw new IllegalArgumentException("不支持的筛选字段:" + field); }; } }
举个使用例子
我们来测试一下这个筛选逻辑,比如筛选总人口在1600万-2500万之间,且男性人口不少于1000万的城市:
public class Main { public static void main(String[] args) { // 模拟测试数据 List<City> cities = List.of( new City("北京", 21540000, 11190000, 10350000), new City("上海", 24280000, 12470000, 11810000), new City("广州", 15300000, 7850000, 7450000) ); // 定义筛选条件 List<CityCondition> conditions = List.of( new CityCondition("total", 16000000, 25000000), new CityCondition("men", 10000000, null) ); // 执行筛选 CityFilter filter = new CityFilter(); List<City> result = filter.filterCities(cities, conditions); // 输出结果:北京、上海 result.forEach(city -> System.out.println(city.getName())); } }
额外说明
- 如果你使用的是Java 17以下的版本,把
getFieldValue里的switch表达式改成传统switch语句即可:private int getFieldValue(City city, String field) { switch (field.toLowerCase()) { case "total": return city.getTotal(); case "men": return city.getMen(); case "women": return city.getWomen(); default: throw new IllegalArgumentException("不支持的筛选字段:" + field); } } - 条件的灵活性很高:只设置
min就是“大于等于XX”,只设置max就是“小于等于XX”,两个都设置就是“介于XX和XX之间”。 - 如果后续需要给City类新增可筛选的数值字段,只需要在
getFieldValue方法里新增对应的case即可。
内容的提问来源于stack exchange,提问作者Huy Tran
相关产品推荐
相关产品推荐

