2015-09-14 72 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; 
相关问题