在java中将ip阵列转换为最小cidr子网列表

在java中将ip阵列转换为最小cidr子网列表,java,ip,cidr,Java,Ip,Cidr,我有一个如下所示的ip阵列,我想将其转换为最小的cidr子网列表。有Java中的库吗 例如: 1.1.3.0 1.1.3.1 1.1.3.2 1.1.3.3 .. 1.1.3.254 1.1.3.255 1.2.3.0 1.2.3.1 1.2.3.2 1.2.3.3 .. 1.2.3.254 1.2.3.255 1.3.3.0 1.3.3.1 1.3.3.2 1.3.3.3 .. 1.3.3.128 1.3.3.129 转化为 1.1.3.0/24 1.2.3.0/24 1.3.3.0/25

我有一个如下所示的ip阵列,我想将其转换为最小的cidr子网列表。有Java中的库吗

例如:

1.1.3.0
1.1.3.1
1.1.3.2
1.1.3.3
..
1.1.3.254
1.1.3.255
1.2.3.0
1.2.3.1
1.2.3.2
1.2.3.3
..
1.2.3.254
1.2.3.255
1.3.3.0
1.3.3.1
1.3.3.2
1.3.3.3
..
1.3.3.128
1.3.3.129
转化为

1.1.3.0/24
1.2.3.0/24
1.3.3.0/25
1.3.3.128/31
提前感谢。

尝试:

public class Test {
    public static void main(String[] args) {
        String[] ipArray1 = new String[]{"1.1.3.1", "1.1.3.3", "1.1.3.2", "1.3.3.254"};
        String[] ipArray2 = new String[ipArray1.length];
        for(int i=0; i < ipArray1.length; i++) {
            String temp = ipArray1[i];
            ipArray2[i] = temp.substring(0,6) + "0/24";
        }
        for(String  ip : ipArray2) {
            System.out.println(ip);
        }
    }
}

我不知道Java中是否有可用的库。事实上,我对Java知之甚少:),但如果有帮助的话,我可以给你一个解决这个问题的算法


1) 将ip地址转换为整数对,其中第一个整数是ip地址的二进制表示形式(a.b.c.d->aJava中有一个用于此的库。有将地址合并到前缀块子网的方法。免责声明:我是IPAddress库的项目经理

以下方法“merge”显示代码,依赖于库中的mergeToPrefixBlocks方法:

static String[] merge(List<String> strs) {
    // convert first to address
    IPAddress first = new IPAddressString(strs.get(0)).getAddress();
    // convert remaining to address
    IPAddress others[] = strs.subList(1, strs.size()).stream().map(str -> new IPAddressString(str).getAddress()).toArray(IPAddress[]::new);
    // merge them all
    IPAddress[] blocks = first.mergeToPrefixBlocks(others);
    // convert back to strings
    return Arrays.stream(blocks).map(block -> block.toString()).toArray(String[]::new);
}

你在开玩笑吗?如果ip像ip一样是12.12.12.1,会发生什么?substr会失败。我需要一个算法解决方案或一个库。你的解决方案基于我的输入,但不同的输入会失败。如果是这样,为什么不在你的帖子中完整地提交呢?我只是以帖子的形式解决问题。这甚至不是一个真正的答案ust生成给定的输出是浪费每个人的时间。它显然不能解决非常明确提出的问题。修正了@compdevI指出的错误的计算。我想知道为什么总是将第一个作为“标记”。比方说,如果第一个子网与其他子网不匹配,它还会合并2…n个子网吗?是的,在大多数情况下,顺序并不重要。第一个子网表示要使用的IP版本。如果可能,将转换与该版本不匹配的子网。如果所有子网都是同一版本,则顺序没有区别。谢谢您的回答。
static String[] merge(List<String> strs) {
    // convert first to address
    IPAddress first = new IPAddressString(strs.get(0)).getAddress();
    // convert remaining to address
    IPAddress others[] = strs.subList(1, strs.size()).stream().map(str -> new IPAddressString(str).getAddress()).toArray(IPAddress[]::new);
    // merge them all
    IPAddress[] blocks = first.mergeToPrefixBlocks(others);
    // convert back to strings
    return Arrays.stream(blocks).map(block -> block.toString()).toArray(String[]::new);
}
ArrayList<String> strs = new ArrayList<>();
String firstPref = "1.1.3.";
String secondPref = "1.2.3.";
String thirdPref = "1.3.3.";
for(int i = 0; i <= 255; i++) {
    strs.add(firstPref + i);
    strs.add(secondPref + i);
}           
for(int i = 0; i <= 129; i++) {
    strs.add(thirdPref + i);
}
String result[] = merge(strs);
System.out.println("blocks are " + Arrays.asList(result));
blocks are [1.3.3.128/31, 1.3.3.0/25, 1.1.3.0/24, 1.2.3.0/24]