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