You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 11:13:54