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

Java实现指定IP区间内IP地址筛选函数的技术求助

解决Java IP地址范围筛选与排序问题

需求回顾

需要实现get_available_IPs函数,接收两个IP地址字符串、一个IP地址数组,返回数组中处于两个指定IP之间的所有地址,且结果按降序排列(从大到小)。

原代码的问题

  1. 数组遍历逻辑错误:处理addresses时,内层循环误用j索引addresses[j],导致重复处理同一个元素;同时ip_numbers3的维度定义反了(应该是addresses.length行、4列,而非4行)。
  2. IP对比逻辑不完整:仅对比IP的第一个分段,忽略了后续三段的数值,会导致大量误判(比如192.168.255.255实际比193.0.0.0大,但只看第一段会被错误排除)。
  3. 标记数组长度错误:flags数组长度设为4,远小于实际addresses的长度,无法正确标记所有元素。
  4. 未处理排序需求:原代码完全没有实现结果的降序排序逻辑。

解决方案

核心思路是将IP地址转换为32位整数(用long存储避免溢出),这样可以直接通过数值大小判断IP的先后顺序,筛选和排序都会变得简单。

完整实现代码

import java.util.Arrays;

public class IpFilter {

    public static String[] get_available_IPs(String ip1, String ip2, String[] addresses) {
        // 将两个边界IP转换为long型数值
        long ip1Long = convertIpToLong(ip1);
        long ip2Long = convertIpToLong(ip2);
        
        // 确定范围的上下限(兼容ip1大于ip2的情况)
        long minIp = Math.min(ip1Long, ip2Long);
        long maxIp = Math.max(ip1Long, ip2Long);
        
        // 筛选符合范围的IP,并按降序排序
        return Arrays.stream(addresses)
                .filter(ip -> {
                    long ipLong = convertIpToLong(ip);
                    return ipLong >= minIp && ipLong <= maxIp;
                })
                .sorted((ipA, ipB) -> Long.compare(convertIpToLong(ipB), convertIpToLong(ipA)))
                .toArray(String[]::new);
    }

    // 辅助方法:将IP字符串转换为long型数值
    private static long convertIpToLong(String ip) {
        String[] segments = ip.split("\\.");
        long result = 0;
        for (int i = 0; i < 4; i++) {
            int segment = Integer.parseInt(segments[i]);
            // 每段左移对应的位数:第一段左移24位,第二段16位,第三段8位,第四段0位
            result |= (long) segment << (24 - i * 8);
        }
        return result;
    }

    // 测试示例
    public static void main(String[] args) {
        // 第一个测试用例
        String ip1 = "192.168.1.1";
        String ip2 = "220.150.1.0";
        String[] addresses1 = {"193.168.10.20","221.155.1.5","194.200.1.5","192.168.1.2"};
        System.out.println(Arrays.toString(get_available_IPs(ip1, ip2, addresses1)));
        // 输出:[194.200.1.5, 193.168.10.20, 192.168.1.2]

        // 第二个测试用例
        String ip3 = "191.168.1.1";
        String ip4 = "222.155.1.5";
        String[] addresses2 = {"193.168.10.20","221.155.1.5","194.200.1.5","192.168.1.1"};
        System.out.println(Arrays.toString(get_available_IPs(ip3, ip4, addresses2)));
        // 输出:[221.155.1.5, 194.200.1.5, 193.168.10.20, 192.168.1.1]
    }
}

代码说明

  1. IP转long:convertIpToLong方法将IP的四个分段分别转换为整数,通过位运算拼接成一个32位的long值,完美对应IP的大小逻辑。
  2. 范围筛选:先确定两个边界IP的最小和最大值,遍历数组时判断每个IP的数值是否在该区间内。
  3. 降序排序:通过自定义比较器,将IP转换为long后按从大到小排序。
  4. 兼容性:自动处理ip1大于ip2的情况,无需额外判断边界顺序。

内容的提问来源于stack exchange,提问作者Alzayer70

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 17:55:20