输出不重复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 }

转载于:https://www.cnblogs.com/liannichang/archive/2012/11/25/2787472.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值