2015-09-14 78 views
1

我在自定義模型中使用lat和lng數組。我想對陣列進行排序,以使距離我的位置最小距離位於頂部位置等等。根據其地理位置對陣列進行排序

這是我曾嘗試

   myLocation = new Location(""); 

       myLocation.setLatitude(Double.valueOf(MyApplication.getInstance().getLatitude())); 
       myLocation.setLongitude(Double.valueOf(MyApplication.getInstance().getLongitude())); 
       Collections.sort(pings, new DistanceComparator()); 


private class DistanceComparator implements java.util.Comparator<PingModel> 
    { 
     @Override 
     public int compare(PingModel lhs, PingModel rhs) 
     { 
      Location lhsLocation = new Location(""); 

      lhsLocation.setLatitude(Double.valueOf(lhs.latloc)); 
      lhsLocation.setLongitude(Double.valueOf(lhs.lngloc)); 

      Location rhsLocation = new Location(""); 

      rhsLocation.setLatitude(Double.valueOf(lhs.latloc)); 
      rhsLocation.setLongitude(Double.valueOf(lhs.lngloc)); 

      return (int)rhsLocation.distanceTo(myLocation) - (int)lhsLocation.distanceTo(myLocation); 
     } 
    } 

結果不知道什麼樣的排序它正在做,但它不是按照距離。

+0

你可以把什麼是'坪'和distanceTo() –

+0

坪是一個自定義模型的數組,而distanceTo是一個常規的谷歌定位函數,計算距離? –

回答

1

您有複製粘貼錯誤。改變這兩條線:

rhsLocation.setLatitude(Double.valueOf(lhs.latloc)); 
rhsLocation.setLongitude(Double.valueOf(lhs.lngloc)); 

到:

rhsLocation.setLatitude(Double.valueOf(rhs.latloc)); // It's rhs! 
rhsLocation.setLongitude(Double.valueOf(rhs.lngloc)); // It's rhs! 

除了這個,你不應該轉換爲int減去距離之前。事實上,你應該避免使用減法作爲比較器的返回值。這有一些衆所周知的缺陷,特別是距離爲float的值,它們可能不適合int。而更重要的是,減法的結果可能不適合int。這意味着您要返回的int可能會溢出,導致意想不到的結果。

我建議你使用清晰易懂的代碼,而不是智能代碼ish,棘手的代碼。考慮更改比較的最後一行到一個共同的三態,如果:

float lhsDistance = lhsLocation.distanceTo(myLocation); 
float rhsDistance = rhsLocation.distanceTo(myLocation); 

if (lhsDistance < rhsDistance) { 
    return -1; 
} else if (lhsDistance > rhsDistance) { 
    return 1; 
} else { 
    return 0; 
} 

注:如果您要比較的值實際上相等,那麼你必須在你的比較返回0。否則,您可能會遇到微妙的,令人討厭的錯誤,如this answer中所述。

+0

試過這個結果仍然是堰,d並沒有正確排序 –

+0

@MuhammadUmar請提供一個樣本列表和'myLocation'的值,所以我們可以進一步幫助。 –

0

不知道這是否有幫助,但我正在研究一個類似的項目,並發現這個鏈接是非常有用的:http://www.geodatasource.com/developers/java

基本上如果你有你的位置;使用距離函數來計算新位置 - 您的位置,然後根據此進行排序。循環訪問位置數組,並根據結果進行排序。

希望它有幫助。

丹。

0

你可以嘗試以下

return Float.compare(lhsLocation.distanceTo(myLocation), rhsLocation.distanceTo(myLocation)) 
0

轉換成int之前減法可能並不總是工作。例如,如果你的distanceTo()函數返回公里,從點的距離和數據點1公里內,則相減的結果可能是0。

而不是

return (int)rhsLocation.distanceTo(myLocation) - (int)lhsLocation.distanceTo(myLocation); 

嘗試

return (rhsLocation.distanceTo(myLocation) - lhsLocation.distanceTo(myLocation)) > 0 ? 1 : -1; 
相關問題