输出不重复ip段
某狗面试题:一个txt文件里存有若干ip地址段,相互有重复有重叠,要求输出不含重复的ip地址段。
分析:1.将ip段从文件中取出来,并存为两个ip地址,ip_start,ip_end
2.将ip地址转为long类型用于比较大小
3.输出两个ip中较小的那个
4.输出两个ip中较大的那个
5.主函数比较两个ip段,分两种情况
a)两个ip段不重叠,则分别输出
b)两个ip段有重叠,则输出(min)ip_start~(max)ip_end
PS:还没考虑多个ip段的比较,没想到好方法,大概要循环比较很多次
1 package test2; 2 3 import java.util.ArrayList; 4 5 public class NoDupliIP { 6 7 public static void main(String[] args) { 8 ArrayList<IPRange> ipRanges = getIP_RangesfromTXT("file/IP.txt"); 9 IPRange A = ipRanges.get(0); 10 IPRange B = ipRanges.get(1); 11 // 两个ip段比较,只有两种情况:1不能合并为一个ip段 12 if (IP2Long(A.getiP_End()) < IP2Long(B.getIP_Start()) 13 || IP2Long(B.getiP_End()) < IP2Long(A.getIP_Start())) { 14 System.out.println(A.getIP_Start() + "-" + A.getiP_End()); 15 System.out.println(B.getIP_Start() + "-" + B.getiP_End()); 16 } else { 17 // 2是合并为一个ip段 18 System.out.println(minIP(A.getIP_Start(), B.getIP_Start()) + "-" 19 + maxIP(A.getiP_End(), B.getiP_End())); 20 } 21 22 } 23 24 /** 25 * 将IP段从txt文件中取出来 26 * 27 * @param txtfilePath 28 * @return 存有IP段的list 29 */ 30 public static ArrayList<IPRange> getIP_RangesfromTXT(String txtfilePath) { 31 ArrayList<IPRange> ipRangesReturn = new ArrayList<IPRange>(); 32 ArrayList<String> ipsArrayList = TxtOperate 33 .getTxt2ArrayList(txtfilePath); 34 for (String t : ipsArrayList) { 35 // 将“-”前后的IP分别存为ipStart和ipEnd 36 String[] tStrings = t.split("-"); 37 String ipStart = tStrings[0]; 38 String ipEnd = tStrings[1]; 39 IPRange ip_range = new IPRange(); 40 ip_range.setIP_Start(ipStart); 41 ip_range.setiP_End(ipEnd); 42 ipRangesReturn.add(ip_range); 43 } 44 return ipRangesReturn; 45 } 46 47 /** 48 * 将一个ip存成long类型用于后续比较大小 49 * 50 * @param ip 51 * @return 52 */ 53 public static long IP2Long(String ip) { 54 long ip_long = 0; 55 String[] ipStrings = ip.split("\\."); 56 ip_long = Long.parseLong(ipStrings[0]) * 1000000000 57 + Long.parseLong(ipStrings[1]) * 1000000 58 + Long.parseLong(ipStrings[2]) * 1000 59 + Long.parseLong(ipStrings[3]); 60 return ip_long; 61 62 } 63 64 /** 65 * 比较2个ip中较小的 66 * 67 * @param IP_A 68 * @param IP_B 69 * @return 70 */ 71 public static String minIP(String IP_A, String IP_B) { 72 Long ipA = IP2Long(IP_A); 73 Long ipB = IP2Long(IP_B); 74 if (ipA < ipB) { 75 return IP_A; 76 } else { 77 return IP_B; 78 } 79 80 } 81 82 /** 83 * 比较2个ip中较大的 84 * 85 * @param IP_A 86 * @param IP_B 87 * @return 88 */ 89 public static String maxIP(String IP_A, String IP_B) { 90 Long ipA = IP2Long(IP_A); 91 Long ipB = IP2Long(IP_B); 92 if (ipA > ipB) { 93 return IP_A; 94 } else { 95 return IP_B; 96 } 97 98 } 99 }
1 package test2; 2 3 public class IPRange { 4 public String IP_Start; 5 public String iP_End; 6 7 public String getIP_Start() { 8 return IP_Start; 9 } 10 11 public void setIP_Start(String iP_Start) { 12 IP_Start = iP_Start; 13 } 14 15 public String getiP_End() { 16 return iP_End; 17 } 18 19 public void setiP_End(String iP_End) { 20 this.iP_End = iP_End; 21 } 22 23 }