CIDR合并Java_CCF-CIDR合并 java代码(仅供参考)修改

importjava.util.ArrayList;importjava.util.Collections;importjava.util.Comparator;importjava.util.List;importjava.util.Scanner;public classMAIN {private static List iPaddresses = new ArrayList();private static List binaryIPaddresses = new ArrayList();public static voidmain(String[] args) {

Scanner scanner= newScanner(System.in);

System.out.println("Input num");int num =scanner.nextInt();

MAIN main= newMAIN();for (int i = 0; i < num; i++) {

String iPString=scanner.next();

IPaddress temPaddress=main.DealTheIPaddress(iPString);

iPaddresses.add(temPaddress);

System.out.println(temPaddress.string+ " len " +temPaddress.len);

}

Collections.sort(iPaddresses,new Comparator() {//排序,先对ip地址大小进行判定,然后相同的条件下考虑前缀长度

@Override//重写,因为题目中要求是先对ip地址排序,然后考虑前缀长度

public intcompare(Object o1, Object o2) {

IPaddress s1=(IPaddress) o1;

IPaddress s2=(IPaddress) o2;

String[] chartString1= s1.string.split("\\.|/");

String[] chartString2= s2.string.split("\\.|/");int[] num1 = new int[4];//存储将ip地址从string转换成int类型的数据

int[] num2 = new int[4];for (int i = 0; i < 4; i++) {

num1[i]=Integer.parseInt(chartString1[i]);

num2[i]=Integer.parseInt(chartString2[i]);

}for (int i = 0; i < 4; i++) {if (num1[i] >num2[i]) {return 1;

}if (num1[i]

}

}if (s1.len >s2.len) {return 1;

}if (s1.len

}return 0;

}

});

main.FTToBinary(iPaddresses);//从小到大合并

main.FSmToBigMerge(iPaddresses);//同级合并

main.SameLevelMerge(iPaddresses);for (int i = 0; i < iPaddresses.size(); i++) {

System.out.println(iPaddresses.get(i).string+ "/" +iPaddresses.get(i).len);

}

scanner.close();

}public IPaddress DealTheIPaddress(String iPString) {//将收到的不完全的ip地址转换成标准的ip地址

IPaddress killqueen= null;

String[] chartStrings= iPString.split("\\.|/");

System.out.println("length " +chartStrings.length);if (chartStrings.length < 5) {//处理不是标准形态的ip地址

if (iPString.contains("/")) {//包含前缀长度的非标准形态的ip地址

int length = Integer.parseInt(chartStrings[chartStrings.length - 1]);

String tempString= chartStrings[0];for (int i = 1; i < chartStrings.length - 1; i++) {

tempString= tempString + "." +chartStrings[i];

}for (int j = chartStrings.length - 1; j < 4; j++) {

tempString= tempString + ".0";

}

killqueen= newIPaddress(tempString, length);

}else {//处理不包含前缀长度的ip地址

int lengh = chartStrings.length * 8;

String tempString= chartStrings[0];for (int i = 1; i < chartStrings.length; i++) {

tempString= tempString + "." +chartStrings[i];

}for (int j = chartStrings.length; j < 4; j++) {

tempString= tempString + ".0";

}

killqueen= newIPaddress(tempString, lengh);

}

}else {//标准形态的ip地址

String tempString = chartStrings[0];for (int i = 1; i < chartStrings.length - 1; i++) {

tempString= tempString + "." +chartStrings[i];

}

killqueen= new IPaddress(tempString, Integer.parseInt(chartStrings[chartStrings.length - 1]));returnkillqueen;

}returnkillqueen;

}public void FTToBinary(List iPaddresses) {//将ip地址从十进制转换成二进制

for (int i = 0; i < iPaddresses.size(); i++) {

IPaddress killqueen= null;

String[] s1= iPaddresses.get(i).string.split("\\.|/");int[] num = new int[5];

String[] binStrings= new String[5];

String tempString= null;for (int j = 0; j < s1.length; j++) {

num[j]=Integer.parseInt(s1[j]);

binStrings[j]=Integer.toBinaryString(num[j]);

}//还需要将ip地址补全,不足8位要补齐

for (int j = 0; j < binStrings.length - 1; j++) {

String tempString2= "0";if (binStrings[j].length() < 8) {for (int k = 1; k < 8 - binStrings[j].length(); k++) {

tempString2= tempString2 + "0";

}

tempString2= tempString2 +binStrings[j];

binStrings[j]=tempString2;

}

}

tempString= binStrings[0];for (int j = 1; j < binStrings.length - 1; j++) {

tempString= tempString + "." +binStrings[j];

}

killqueen= newIPaddress(tempString, iPaddresses.get(i).len);

binaryIPaddresses.add(killqueen);

}

}public void FSmToBigMerge(ListiPaddresses) {for (int i = 0; i < binaryIPaddresses.size() - 1; i++) {boolean same = true;

String[] s1= new String[4];

String[] s2= new String[4];

String string1= null;

String string2= null;char[] char1 = new char[32];char[] char2 = new char[32];

s1= binaryIPaddresses.get(i).string.split("\\.");

s2= binaryIPaddresses.get(i + 1).string.split("\\.");

string1= s1[0];

string2= s2[0];for (int j = 1; j < s1.length; j++) {

string1= string1 +s1[j];

string2= string2 +s2[j];

}for (int j = 0; j < 32; j++) {

char1[j]=string1.charAt(j);

char2[j]=string2.charAt(j);

}for (int j = 0; j < binaryIPaddresses.get(i).len; j++) {if (char1[j] !=char2[j]) {

same= false;break;

}

}if (!same) {continue;

}if(same) {

binaryIPaddresses.remove(i+ 1);

iPaddresses.remove(i+ 1);

i--;continue;

}

}

}public void SameLevelMerge(ListiPaddresses) {for (int i = 0; i < binaryIPaddresses.size() - 1; i++) {

String[] s1= new String[4];

String[] s2= new String[4];

String string1= null;

String string2= null;char[] char1 = new char[32];char[] char2 = new char[32];

IPaddress newip= null;

IPaddress newip1= null;boolean couldmerge = true;if (binaryIPaddresses.get(i).len == binaryIPaddresses.get(i + 1).len) {

s1= binaryIPaddresses.get(i).string.split("\\.");

s2= binaryIPaddresses.get(i + 1).string.split("\\.");

string1= s1[0];

string2= s2[0];for (int j = 1; j < s1.length; j++) {

string1= string1 +s1[j];

string2= string2 +s2[j];

}for (int j = 0; j < string1.length(); j++) {

char1[j]=string1.charAt(j);

char2[j]=string2.charAt(j);

}if (char1[binaryIPaddresses.get(i).len - 1] == '0') {

newip= new IPaddress(binaryIPaddresses.get(i).string, binaryIPaddresses.get(i).len - 1);

newip1= new IPaddress(iPaddresses.get(i).string, iPaddresses.get(i).getlength() - 1);

}else{continue;

}for (int j = 0; j < newip.len; j++) {if (char1[j] !=char2[j]) {

couldmerge= false;

}

}if (!couldmerge) {continue;

}if(couldmerge) {

binaryIPaddresses.remove(i+ 1);//先移除i+1,因为如果先移除i,那么后面的下标会自动-1,那么后面移除的i+1其实是原来的i+2

binaryIPaddresses.remove(i);

binaryIPaddresses.add(i, newip);

iPaddresses.remove(i+ 1);

iPaddresses.remove(i);

iPaddresses.add(i, newip1);

i--;

}

}else{continue;

}

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值