2017-07-16 37 views
0

假設一個「json」對象在我的某個文件位置可用,閱讀文件,評估距離並邀請朋友是任務。根據我朋友給出的經度和緯度位置,我想邀請他們

require 'json' 
class GeoSearch 
    attr_accessor :originalLatitude, :originalLongitude, :invitationMap 
    def initialize 
     @originalLatitude = 28.521134 
     @originalLongitude = 77.206567 
     @invitationMap = Hash.new 
    end 
    def degreesToRadians(degrees) 
     return degrees * Math::PI/180 
    end 

    def findDistance(lat1, long1, lat2, long2) 
     earthRadiusKm = 6371 

     deltaLat = degreesToRadians(lat2 - lat1) 
     deltaLon = degreesToRadians(long2 - long1) 

     lat1 = degreesToRadians(lat1) 
     lat2 = degreesToRadians(lat2) 

     arial = Math.sin(deltaLat/2) * Math.sin(deltaLat/2) + Math.sin(deltaLon/2) * Math.sin(deltaLon/2) * Math.cos(lat1) * Math.cos(lat2) 

     distance = earthRadiusKm * (2 * Math.atan2(Math.sqrt(arial), Math.sqrt(1-arial))) 

     distance 
    end 

    def readJsonFile(fileName) 
     file = File.read(fileName) 
     jsonData = JSON.parse(file) 
     jsonArray = jsonData["friends"] 
     iteratorOnJson(jsonArray) 
    end 

    def iteratorOnJson(jsonArray) 
     visitingFriendsIds = [] 
     jsonArray.each do |element| 
      if(findDistance(@originalLatitude, @originalLongitude, element['latitude'], element['longitude']) <= 100) 
       visitingFriendsIds << element['id'] 
       @invitationMap[element['id']] = element['name'] 
      end 
     end 
     visitingFriendsIds = sortElements(visitingFriendsIds, 0 ,visitingFriendsIds.length-1) 
     sendInvitationtoFriends(visitingFriendsIds, jsonArray) 
    end 
    def sendInvitationtoFriends(visitingFriendsIds, jsonArray) 
     visitingFriendsIds.each do |friendId| 
      puts "id: " + friendId.to_s + " name: " + @invitationMap[friendId] 
     end 
    end 
    def sortElements(inputArray, low, high) 
     if(low < high) 
      partition = quickSort(inputArray, low, high) 
      sortElements(inputArray, low, partition-1) 
      sortElements(inputArray, partition+1, high) 
     end 
     inputArray 
    end 
    def quickSort(inputArray, low, high) 
     pivotalPoint = inputArray[high] 
     index = low 
     for iterator in low..high do 
      if(inputArray[iterator] <= pivotalPoint) 
       swapElements(inputArray, iterator, index) 
       index = index + 1 
      end 
     end 
     index -1 
    end 
    def swapElements(inputArray, xIndex, yIndex) 
     temp = inputArray[xIndex] 
     inputArray[xIndex] = inputArray[yIndex] 
     inputArray[yIndex] = temp 
    end 
end 

GeoSearch.new.readJsonFile("/home/neha/Desktop/friends.json")#Add your fileName 

如果JSON對象的樣子:

# { 
# "friends": [ 
# { 
# "id": "5", 
# "name": "Agueda", 
# "latitude": 28.521134, 
# "longitude": 78.206567 
# }, 
# { 
# "id": "2", 
# "name": "Hisako", 
# "latitude": 28.521134, 
# "longitude": 74.206567 
# }, 
# { 
# "id": "1", 
# "name": "Addie", 
# "latitude": 28.521134, 
# "longitude": 76.206567 
# }, 
# { 
# "id": "4", 
# "name": "Laure", 
# "latitude": 37.5758033375583, 
# "longitude": -122.012044535507 
# }, 
# { 
# "id": "3", 
# "name": "Maye", 
# "latitude": 41.77117, 
# "longitude": -87.888795 
# } 
# ] 
# } 

輸出相匹配的朋友的名字和用戶ID(內100公里),由用戶ID(升序)排序。

有什麼辦法可以降低寫入的方法的複雜度。

回答

1

您可以使用Haversine Formula來計算距離,然後將該距離添加到用戶散列。那種選擇一個給定距離內的那些:

require "json" 

friends=JSON.parse(DATA.read)['friends'] 

olat = 28.521134 
olon = 77.206567 

friends 
    .map {|h| h['dist']=findDistance olat, olon, h["latitude"], h["longitude"]; h} 
    .select {|h| h['dist']<100} 
    .sort_by {|h| h['id']} 
    .each {|h| puts "%s is %.2f kilometers away" % [h['name'], h['dist']]} 

__END__ 
{ 
    "friends": [ 
    { 
    "id": "5", 
    "name": "Agueda", 
    "latitude": 28.521134, 
    "longitude": 78.206567 
}, 
    { 
    "id": "2", 
    "name": "Hisako", 
    "latitude": 28.521134, 
    "longitude": 74.206567 
}, 
    { 
    "id": "1", 
    "name": "Addie", 
    "latitude": 28.521134, 
    "longitude": 76.206567 
}, 
    { 
    "id": "4", 
    "name": "Laure", 
    "latitude": 37.5758033375583, 
    "longitude": -122.012044535507 
}, 
    { 
    "id": "3", 
    "name": "Maye", 
    "latitude": 41.77117, 
    "longitude": -87.888795 
} 
] 
} 

打印:

Addie is 97.70 kilometers away 
Agueda is 97.70 kilometers away