基於ip定位城市的簡單實現

2021-07-09 12:55:30 字數 1789 閱讀 2898

剛來公司報道實習,主管交給我第乙個任務是乙個統計使用者,的註冊ip,區分是新疆,**,國外,國內其它地區。

之前有乙個做完的工程,就直接給我了。我仔細閱讀了一下,我先說一下思路,這個問題我之前電面阿里的時候,被問到過,現在才知道,也是艱難。

這是關鍵的幾個資源txt,最後其實也就是靠著掃字典txt,來實現的。首先看一下,ip.txt的內容。

第一步就是要用buffered reader,來讀取,這一整個檔案,很大,每一行的第乙個跟第三個是ip的前後範圍。隨之與之對應的是long(由ip轉換),最後的的三個字段,第乙個是代表城市code,第二個是省份code,後面的運營商。我們來看一下,city.txt,跟province.txt你就明白了。

下面province.txt

而fip是後來主管,給我的,但是發現是無規則的,而要求必須是由小到大的(原來後面就明白了)。

下面進入正題

first:載入ip.txt,跟fip.txt  分別載入成兩個arraylist。ip物件到list,ip物件有乙個startip,endip屬性(資料來源我當時是用的線上註冊使用者表,4000多萬,累死,跑了接近兩個小時)

second: 載入province,city,用兩個map來存放,便於後邊根據,code來取值。

3:最關鍵的一步,我們獲得資料來源後,得到了ip字串,我們怎麼從ip從list找出來?答案就在startip,endip裡,區間的二分查詢,比較簡單。所以我在第一步的時候,獲得了fip(由於txt不是有序的)的list,我直接來了一部排序,看**。

comparatorcomparator = new comparator()else

}};collections.sort(fips,comparator);

下面附上二分查詢的**

private ip binarysearch(long

ipvalue) else

if (ips.get(middle).getstartip() >ipvalue) else

if (ips.get(middle - 1).getstartip()

} else

} else

if (ips.get(middle).getstartip()

} else

if (ips.get(middle + 1).getstartip() ==ipvalue) else }}

// 位於第乙個區間的ip

if ((low >=high) && (ipvalue >=ips.get(0).getstartip()) && (ipvalue

<=ips.get(0).getendip()))

// 位於最後乙個區間的ip

if ((low >=high) && (ipvalue >=ips.get(size - 1).getstartip()) && (ipvalue

<=ips.get(size - 1).getendip()))

return

ip;}

而基於經緯度定位,其實也就是掃另乙個字典。

Android 通過外網IP定位城市

通過cmyip獲取獲取外網外網位址 需在非同步執行緒中訪問 return 外網ip public static string getouternetformcmyip 1 9 d 25 0 5 2 0 4 d 1 d 1 9 d matcher matcher pattern.matcher res...

js實現根據IP定位使用者所在城市資訊

即可返回當前ip所在的省市資訊。本地js呼叫 var myprovince remote ip info province var mycity remote ip info city var mydistrict remote ip info district function html 為 您所...

根據IP定位使用者所在城市資訊

即可返回當前ip所在的省市資訊。本地js呼叫 var myprovince remote ip info province var mycity remote ip info city var mydistrict remote ip info district function html 為 您所...