别的不难,输入输出还调试了好一会。
难点主要在于错误ip的判断上面,定义了个flag,先判断ip在判断掩码,ip只是判断了下是否为空,掩码的判断的话使用了多重判断,一位一位判断,先1后0就那8中情况,判断是不是在list范围里面就行,在去除掉两个边缘情况 全是1或者全是0。
地址范围和私有ip则直接用了个函数去做,只用传ip的前两位过去判断就行。
import java.util.Arrays; import java.util.List; import java.util.Scanner; import java.util.stream.Collectors; /** * decription:识别有效的IP地址和掩码并进行分类统计 */ public class classify { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int[] count = {0, 0, 0, 0, 0, 0, 0}; //个数数组 while (scanner.hasNext()) { String str = scanner.nextLine(); String[] strings = str.split("~"); String ipStr = strings[0]; //ip // System.out.println(ipStr); String codeStr = strings[1]; //掩码 // System.out.println(codeStr); String[] ipCharStr = ipStr.split("\\."); //判断ip是否为空或者首字符是否等于0 Boolean isTrue = true; int number = Integer.parseInt(ipCharStr[0]); if (number == 0) continue; //为0直接跳出本次循环 else { for (int i = 0; i < ipCharStr.length; i++) { if (ipCharStr[i].length() <= 0 || ipCharStr[i] == "") { isTrue = false; } } } //如果ip地址正确判断掩码是否正确 if (isTrue) { //判断掩码是否正确 int[] codeRange = {254, 252, 248, 240, 224, 192, 128, 0}; List<Integer> list = Arrays.stream(codeRange).boxed().collect(Collectors.toList());//int数组转化为list String[] codeCharStr = codeStr.split("\\."); //判断是否前面全为1后面全为0 if ("255".equals(codeCharStr[0])) { if ("255".equals(codeCharStr[1])) { if ("255".equals(codeCharStr[2])) { if ("255".equals(codeCharStr[3])) { isTrue = false; } else if (list.contains(Integer.parseInt(codeCharStr[3]))) { isTrue = true; } else isTrue = false; } else if (list.contains(Integer.parseInt(codeCharStr[2]))) { if (Integer.parseInt(codeCharStr[3]) == 0) isTrue = true; else isTrue = false; } else isTrue = false; } else if (list.contains(Integer.parseInt(codeCharStr[1]))) { if (Integer.parseInt(codeCharStr[2]) == 0 && Integer.parseInt(codeCharStr[3]) == 0) isTrue = true; else isTrue = false; } else isTrue = false; } else if (list.contains(Integer.parseInt(codeCharStr[0]))) { if (Integer.parseInt(codeCharStr[0]) == 0) { isTrue = false; } else { if (Integer.parseInt(codeCharStr[1]) == 0 && Integer.parseInt(codeCharStr[2]) == 0 && Integer.parseInt(codeCharStr[3]) == 0) isTrue = true; else isTrue = false; } } else isTrue = false; } //调用方法判断地址范围和私网ip if (isTrue) { int first = Integer.parseInt(ipCharStr[0]); int second = Integer.parseInt(ipCharStr[1]); count = judgeIp(first, second, count); } else { count[5]++; } } System.out.println(count[0] + " " + count[1] + " " + count[2] + " " + count[3] + " " + count[4] + " " + count[5] + " " + count[6]); } //判断地址范围和私网ip public static int[] judgeIp(int first, int second, int[] count) { //判断地址范围 if (first >= 1 && first <= 126) count[0]++; else if (first >= 128 && first <= 191) count[1]++; else if (first >= 192 && first <= 223) count[2]++; else if (first >= 224 && first <= 239) count[3]++; else if (first >= 240 && first <= 255) count[4]++; //判断私网ip if (first == 192 && second == 168) count[6]++; if (first == 10) count[6]++; if (first == 172) { if (second >= 16 && second <= 31) count[6]++; } return count; } }