IP查找所属网段

最近同学接到阿里面试题

 1 package io.guangsoft.analysis;
 2 
 3 /*
 4      数据文件:
 5     1.1.1.0/24,123
 6     1.1.2.0/28,345
 7     1.2.0.0/16,789 
 8  */
 9 public interface Finder {
10     //完成初始化动作
11     boolean loadFile(String fileName);
12     //查找具体IP所在IP网段的键值,未找到返回-1;比如如果输入样例数据文件,调用find("1,1,1,1"),返回123
13     int find(String ipStr); 
14 }

搜索一番解答如下

 1 package io.guangsoft.analysis;
 2 
 3 import java.io.BufferedReader;
 4 import java.io.File;
 5 import java.io.FileReader;
 6 import java.util.HashMap;
 7 import java.util.Map;
 8 
 9 import org.apache.commons.net.util.SubnetUtils;
10 import org.apache.commons.net.util.SubnetUtils.SubnetInfo;
11 
12 public class FinderImpl implements Finder {
13 
14     private Map<String, String> dataMap = new HashMap<String, String>();
15     
16     @Override
17     public boolean loadFile(String fileName) {
18         File file = new File(this.getClass().getClassLoader().getResource(fileName).getFile());
19         try {
20             FileReader fileReader = new FileReader(file);
21             BufferedReader bufferedReader = new BufferedReader(fileReader);
22             while(true) {
23                 String nextLine = bufferedReader.readLine();
24                 if(nextLine == null) {
25                     break;
26                 } else {
27                     String str[] = nextLine.split(",");
28                     dataMap.put(str[0], str[1]);
29                 }
30             }
31         } catch (Exception e) {
32             e.printStackTrace();
33             return false;
34         }
35         return true;
36     }
37 
38     @Override
39     public int find(String ip) {
40         for(String network : dataMap.keySet()) {
41             boolean bingo = isInRange(ip, network);
42             if(bingo) {
43                 return Integer.parseInt(dataMap.get(network)); 
44             }
45         }
46         return -1;
47     }
48     
49     //核心代码,检索IP所属网段
50     public boolean isInRange(String ip, String network) {
51         String[] ips = ip.split("\.");  
52         int ipAddr = (Integer.parseInt(ips[0]) << 24)  
53                 | (Integer.parseInt(ips[1]) << 16)  
54                 | (Integer.parseInt(ips[2]) << 8) 
55                 | Integer.parseInt(ips[3]);  
56         int type = Integer.parseInt(network.replaceAll(".*/", ""));  
57         int mask = 0xFFFFFFFF << (32 - type);  
58         String networkIp = network.replaceAll("/.*", "");  
59         String[] networkIps = networkIp.split("\.");  
60         int networkIpAddr = (Integer.parseInt(networkIps[0]) << 24)  
61                 | (Integer.parseInt(networkIps[1]) << 16)  
62                 | (Integer.parseInt(networkIps[2]) << 8)  
63                 | Integer.parseInt(networkIps[3]);  
64          return (ipAddr & mask) == (networkIpAddr & mask);
65     }
66     
67     //也可以使用apache的net工具类
68     public boolean isInRange2(String ip, String network) {
69         SubnetInfo subnetInfo = new SubnetUtils(network).getInfo();
70         return subnetInfo.isInRange(ip);
71     }
72     
73     public static void main(String args[]) {
74         FinderImpl finder = new FinderImpl();
75         if(finder.loadFile("data.txt")) {
76             int num = finder.find("1.1.1.1");
77             System.out.println(num);
78         }
79     }
80     
81 }
原文地址:https://www.cnblogs.com/guanghe/p/9525596.html