最近同学接到阿里面试题
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 }