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;
}
}
}
}