使用二分查找法,查找ip所在的范围对应的code(语言为java\scala\python) java语言来实现

  1. 使用二分法实现查找ip所在的范围,并返回对应的id

start_ip end_ip code

0.0.0.0 1.0.0.255 1000000000

1.0.1.0 1.0.3.255 1156350100

1.0.4.0 1.0.7.255 1036000000

1.0.8.0 1.0.15.255 1156440100

java程序实现

行数据实体类

package IpRange;

public class MyIp {

    private long startIP;
    private long endIP;
    private String code;

    //构造方法
    public MyIp(long startIP, long endIP, String code) {
        this.startIP = startIP;
        this.endIP = endIP;
        this.code = code;
    }
    //空构造方法
    public MyIp(){}
    //toString方法

    @Override
    public String toString() {
        return "MyIp{" +
                "startIP=" + startIP +
                ", endIP=" + endIP +
                ", code='" + code + '\'' +
                '}';
    }
    //get与set方法

    public long getStartIP() {
        return startIP;
    }

    public void setStartIP(long startIP) {
        this.startIP = startIP;
    }

    public long getEndIP() {
        return endIP;
    }

    public void setEndIP(long endIP) {
        this.endIP = endIP;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }
}

ip地址转换工具类

package IpRange;

public class IPUtils {
    /**
     * ip地址转成long型数字
     * 将IP地址转化成整数的方法如下:
     * 1、通过String的split方法按.分隔得到4个长度的数组
     * 2、通过左移位操作(<<)给每一段的数字加权,第一段的权为2的24次方,第二段的权为2的16次方,第三段的权为2的8次方,最后一段的权为1
     * @param strIp
     * @return
     */
    public static long ipToLong(String strIp) {
        String[]ip = strIp.split("\\.");
        return (Long.parseLong(ip[0]) << 24) +
                (Long.parseLong(ip[1]) << 16) + (Long.parseLong(ip[2]) << 8) + Long.parseLong(ip[3]);
    }

    /**
     * 将十进制整数形式转换成127.0.0.1形式的ip地址
     * 将整数形式的IP地址转化成字符串的方法如下:
     * 1、将整数值进行右移位操作(>>>),右移24位,右移时高位补0,得到的数字即为第一段IP。
     * 2、通过与操作符(&)将整数值的高8位设为0,再右移16位,得到的数字即为第二段IP。
     * 3、通过与操作符吧整数值的高16位设为0,再右移8位,得到的数字即为第三段IP。
     * 4、通过与操作符吧整数值的高24位设为0,得到的数字即为第四段IP。
     * @param longIp
     * @return
     */
    public static String longToIP(long longIp) {
        StringBuffer sb = new StringBuffer("");
        // 直接右移24位
        sb.append(String.valueOf((longIp >>> 24)));
        sb.append(".");
        // 将高8位置0,然后右移16位
        sb.append(String.valueOf((longIp & 0x00FFFFFF) >>> 16));
        sb.append(".");
        // 将高16位置0,然后右移8位
        sb.append(String.valueOf((longIp & 0x0000FFFF) >>> 8));
        sb.append(".");
        // 将高24位置0
        sb.append(String.valueOf((longIp & 0x000000FF)));
        return sb.toString();
    }

    public static void main(String[] args) {
        System.out.println(ipToLong("219.239.110.138"));
        System.out.println(longToIP(18537472));
    }
}

ip查找类的实现

package IpRange;

import java.io.*;
import java.util.LinkedList;

public class IpRange {

/**
*
*@author ***
*@date
*二分查找法
*/
    public static MyIp getIpCode(String ip){

        MyIp[] myIps=getmyip();
        if(myIps==null||myIps.length==0) return null;
        long iplong=IPUtils.ipToLong(ip);
        if(iplong<myIps[0].getStartIP()||iplong>myIps[myIps.length-1].getEndIP()) return null;
        int left=0;
        int right=myIps.length-1;
        int mid=(left+right)/2;
        while (left<=right){

            if(iplong<myIps[mid].getStartIP()) right=mid-1;

            if(iplong>myIps[mid].getStartIP()) left=mid+1;

            if(iplong>=myIps[mid].getStartIP()&&iplong<=myIps[mid].getEndIP()) return myIps[mid];

            mid=(left+right)/2;

        }
        return null;

    }
    /**
    *@author
    *@date
    *读取文件转换成MyIp对象
    */
    public static MyIp[] getmyip(){
        InputStreamReader inputStreamReader=null;
        BufferedReader bufferedReader=null;
        File file=new File("E:\\aaa\\iprule");
        try {
            inputStreamReader=new InputStreamReader(new FileInputStream(file),"UTF-8");

            bufferedReader=new BufferedReader(inputStreamReader);

            String line;

            LinkedList<MyIp> linkedList=new LinkedList<MyIp>();

            while ((line=bufferedReader.readLine())!=null){

                String[] ipranges=line.split(",");


                linkedList.add(new MyIp(IPUtils.ipToLong(ipranges[0]),IPUtils.ipToLong(ipranges[1]),ipranges[2]));
            }
            MyIp[] myIps=linkedList.toArray(new MyIp[]{});
            return myIps;

        } catch (IOException e) {
            e.printStackTrace();
        }
    return null;
    }

    public static void main(String[] args) {

        MyIp myIp=getIpCode("1.2.16.15");

        String code=myIp.getCode();
        System.out.println("你所在的城市为:"+code);


    }
}

猜你喜欢

转载自blog.csdn.net/qq_37001101/article/details/84957654
今日推荐