实战代码优化:数组和Set遍历的时间复杂度

优化前代码

    public static Boolean queryParamContrast(String params) {
        if (params.length() > 4) {
            return false;
        }

        for (String city : cityArray) {
            if (StringUtils.equals(city, params)) {
                return true;
            }
        }
        return false;
    }

    public static String[] cityArray = {
            "北京",
            "北京市",
            "天津",
            "天津市",
            "上海",
            "上海市",
            "江苏",
            "江苏省",
            "河北"
    };

优化方案

1. 使用 Set 代替数组

  • 使用 Set(如 HashSet)来存储城市名称,可以提高查询效率,因为 Set 的 contains 方法时间复杂度为 O(1),而数组的遍历时间复杂度为 O(n)。

2. 将城市数据提取到配置文件

  • 将城市数据提取到外部配置文件(如 .properties 或 .json 文件),便于维护和扩展。

3. 优化方法逻辑

  • 直接使用 Set 的 contains 方法来判断城市是否存在,简化代码逻辑。

4. 使用 final 修饰常量

  • 将 cityArray 改为 final,确保其不可变。

优化后代码

方案 1:使用 Set 优化

package com.tibiot.oa.constant;

import org.apache.commons.lang3.StringUtils;

import java.util.HashSet;
import java.util.Set;

public class CityConstant {

    private static final Set CITY_SET = new HashSet<>();

    static {
        // 初始化城市数据
        String[] cityArray = {
            "北京", "北京市", "天津", "天津市", "上海", "上海市", "江苏", "江苏省", 
            // 其他城市数据...
        };
        for (String city : cityArray) {
            CITY_SET.add(city);
        }
    }

    // 私有构造函数,防止实例化
    private CityConstant() {
    }

    /**
     * 判断参数是否是城市名称
     *
     * @param params 检索词
     * @return 如果是城市名称返回 true,否则返回 false
     */
    public static boolean isCity(String params) {
        if (StringUtils.isBlank(params) || params.length() > 4) {
            return false;
        }
        return CITY_SET.contains(params);
    }
}

方案 2:将城市数据提取到配置文件

  1. 创建一个 cities.properties 文件:
  2. 修改代码加载配置文件:
package com.tibiot.oa.constant;

import org.apache.commons.lang3.StringUtils;

import java.io.IOException;
import java.io.InputStream;
import java.util.HashSet;
import java.util.Properties;
import java.util.Set;

public class CityConstant {

    private static final Set CITY_SET = new HashSet<>();

    static {
        // 加载城市数据
        Properties properties = new Properties();
        try (InputStream input = CityConstant.class.getClassLoader().getResourceAsStream("cities.properties")) {
            if (input == null) {
                throw new RuntimeException("无法找到 cities.properties 文件");
            }
            properties.load(input);
            String cities = properties.getProperty("cities");
            if (cities != null) {
                for (String city : cities.split(",")) {
                    CITY_SET.add(city.trim());
                }
            }
        } catch (IOException e) {
            throw new RuntimeException("加载城市数据失败", e);
        }
    }

    // 私有构造函数,防止实例化
    private CityConstant() {
    }

    /**
     * 判断参数是否是城市名称
     *
     * @param params 检索词
     * @return 如果是城市名称返回 true,否则返回 false
     */
    public static boolean isCity(String params) {
        if (StringUtils.isBlank(params) || params.length() > 4) {
            return false;
        }
        return CITY_SET.contains(params);
    }
}

优化后的优点:

  1. 性能提升

    • 使用 Set 代替数组,查询效率从 O(n) 提升到 O(1)。

  2. 可维护性增强

    • 将城市数据提取到配置文件,便于维护和扩展。

  3. 代码简洁

    • 使用 Set 的 contains 方法,简化了逻辑。

  4. 灵活性提高

    • 配置文件可以动态加载,无需修改代码即可更新城市数据。

总结:

通过使用 Set 存储城市数据,并将数据提取到配置文件中,可以提高代码的性能、可维护性和灵活性。

你可能感兴趣的:(#,实战优化,java,开发语言)