ccf考试201812_3之 CIDR合并
代码评分:60
总结:考场中这种代码的工程量很大,需要不断地调试很费时间,不如得一部分分数就放手
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class test2 {
public static void main(String[] args) {
//1.初始化数据
Scanner scanner = new Scanner(System.in);
int num = scanner.nextInt(); //数据条数
List<IPClass> ip_list = new ArrayList<IPClass>(); //存放ip的list
//2.将输入的数据标准化
String inputIP;
for (int i = 0; i < num ; i++) {
inputIP = scanner.next();
//可能有三种数据类型:
//标准型,不需要变化
//省略后缀,补上后缀
//省略长度,补上长度
if (inputIP.contains("/")) {
String[] ip_length = inputIP.split("/");
String[] ip = ip_length[0].split("\\.");
if (ip.length == 4){ //标准型
ip_list.add(new IPClass(ip[0],ip[1],ip[2],ip[3],ip_length[1]));
}else { //省略后缀
String[] ip_temp = new String[4];
for (int j = 0; j < ip.length ; j++) {
ip_temp[j] = ip[j];
}
for (int j = ip.length; j <4; j++) {
ip_temp[j] = "0";
}
IPClass ipClass = new IPClass(ip_temp[0],ip_temp[1],ip_temp[2],ip_temp[3],ip_length[1]);
ip_list.add(ipClass);//加入list
}
}else {//省略长度
String[] ip = inputIP.split("\\.");
//得到省略的长度
int length = ip.length*8;
//补充后缀
String[] ip_temp = new String[4];
for (int j = 0; j < ip.length ; j++) {
ip_temp[j] = ip[j];
}
for (int j = ip.length; j <4; j++) {
ip_temp[j] = "0";
}
IPClass ipClass = new IPClass(ip_temp[0],ip_temp[1],ip_temp[2],ip_temp[3],length+"");
ip_list.add(ipClass);
}
}
//3.排序ip第一关键字,长度第二关键字
List<IPClass> list_result1 = new ArrayList<IPClass>(); //用于存储排序的结果
while (ip_list.size() != 0){
//找到ip_list中最下的元素,
IPClass ipClass_min = new IPClass("256","256","256","256","32");
for (IPClass ipClass: ip_list) {
if(ipClass_min.compareTo(ipClass) > 0){
ipClass_min = new IPClass(ipClass.ip_1,ipClass.ip_2,ipClass.ip_3,ipClass.ip_4,ipClass.length);
}
}
//最小的而元素从ip_list中删除,加入到list_result1
ip_list.remove(ipClass_min);
list_result1.add(ipClass_min);
}
//输出结果
for (int i = 0; i < list_result1.size(); i++) {
System.out.println(list_result1.get(i));
}
}
static class IPClass{
String ip_1;
String ip_2;
String ip_3;
String ip_4;
String length;
public IPClass(String ip_1,String ip_2,String ip_3,String ip_4,String length){
this.ip_1 = ip_1;
this.ip_2 = ip_2;
this.ip_3 = ip_3;
this.ip_4 = ip_4;
this.length = length;
}
public IPClass(){
}
@Override
public boolean equals(Object obj) {
if(this.ip_1 == ((IPClass) obj).ip_1
&& this.ip_2 == ((IPClass) obj).ip_2
&& this.ip_3 == ((IPClass) obj).ip_3
&& this.ip_4 == ((IPClass) obj).ip_4
&& this.length == ((IPClass) obj).length
){
return true;
}
return false;
}
@Override
public String toString() {
return ip_1+"."+ip_2+"."+ip_3+"."+ip_4+"/"+length;
}
//返回-1表示this小于object
public int compareTo(IPClass o) {
//根绝ip_1到length得优先级挨个比较
if(Integer.parseInt(this.ip_1) < Integer.parseInt(o.ip_1)){
return -1;
}else if(Integer.parseInt(this.ip_1) == Integer.parseInt(o.ip_1)){
if(Integer.parseInt(this.ip_2) < Integer.parseInt(o.ip_2)) {
return -1;
}else if(Integer.parseInt(this.ip_2) == Integer.parseInt(o.ip_2)) {
if(Integer.parseInt(this.ip_3) < Integer.parseInt(o.ip_3)){
return -1;
}else if(Integer.parseInt(this.ip_3) == Integer.parseInt(o.ip_3)){
if(Integer.parseInt(this.ip_4) < Integer.parseInt(o.ip_4)){
return -1;
}else if(Integer.parseInt(this.ip_4) == Integer.parseInt(o.ip_4)){
if(Integer.parseInt(this.length) < Integer.parseInt(o.length)){
return -1;
}
}
}
}
}
return 1;
}
}
}