剛來公司報道實習,主管交給我第乙個任務是乙個統計使用者,的註冊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 為 您所...