最近同学接到阿里面试题
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"),返回12313 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 MapdataMap = new HashMap ();15 16 @Override17 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 @Override39 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 }