Java 根据阵列的地理位置对其进行排序

Java 根据阵列的地理位置对其进行排序,java,android,eclipse,sorting,android-studio,Java,Android,Eclipse,Sorting,Android Studio,我在定制模型中有一个带有lat和lng的阵列。我想对数组进行排序,以便距离我所在位置的最小距离位于顶部位置,依此类推 这是我试过的 myLocation = new Location(""); myLocation.setLatitude(Double.valueOf(MyApplication.getInstance().getLatitude())); myLocation.setLongitud

我在定制模型中有一个带有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);
        }
    }
myLocation=新位置(“”);
myLocation.setLatitude(Double.valueOf(MyApplication.getInstance().getLatitude());
setLongitude(Double.valueOf(MyApplication.getInstance().getLongitude());
排序(pings,newdistancecomparator());
私有类DistanceComparator实现java.util.Comparator
{
@凌驾
公共整数比较(PingModel lhs、PingModel rhs)
{
位置lhsLocation=新位置(“”);
lhsLocation.setLatitude(Double.valueOf(lhs.latloc));
设置经度(Double.valueOf(lhs.lngloc));
位置rhsLocation=新位置(“”);
rhsLocation.setLatitude(双倍值(lhs.latloc));
rhsLocation.SetLength(Double.valueOf(lhs.lngloc));
返回(int)rhsLocation.distanceTo(myLocation)-(int)lhsLocation.distanceTo(myLocation);
}
}

结果不确定它正在进行什么样的排序,但它不是根据距离进行的。

不确定这是否有帮助,但我正在从事一个类似的项目,并发现此链接非常有用:

基本上,如果你有你的位置;使用距离函数计算新位置-您的位置,然后根据该位置进行排序。循环遍历位置数组,并根据结果进行排序

希望能有帮助

丹。

你能试试下面的吗

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

在减法之前转换为int可能并不总是有效的。例如,如果
distanceTo()
函数返回km,且与点和数据点的距离在1km以内,则减法结果可能为0

而不是

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


您有一个复制粘贴错误。更改这两行:

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

除此之外,在减去距离之前,不应转换为
int
。事实上,您应该避免使用减法作为比较器的返回值。这有一些众所周知的缺陷,特别是当距离是
浮点值时,它们可能不适合
int
。更重要的是,减法的结果可能不适合
int
。这意味着您将返回的
int
可能会溢出,导致意外结果

我建议您使用清晰、易懂的代码,而不是聪明、棘手的代码。如果你把你的比较器的最后一行改变成一个普通的三态:
float lhsDistance = lhsLocation.distanceTo(myLocation);
float rhsDistance = rhsLocation.distanceTo(myLocation);

if (lhsDistance < rhsDistance) {
    return -1;
} else if (lhsDistance > rhsDistance) {
    return 1;
} else {
    return 0;
}
float lhsDistance=lhsLocation.distance to(myLocation);
浮动rhsDistance=rhsLocation.distanceTo(myLocation);
if(左侧距离<右侧距离){
返回-1;
}否则如果(左侧距离>右侧距离){
返回1;
}否则{
返回0;
}

注意:如果要比较的值实际上相等,则必须在比较器中返回0。否则,您可能会遇到微妙的、令人讨厌的错误,如中所述。

您能把什么叫做“pings”和distanceTo()pings是一组自定义模型,distanceTo是一个计算距离的常规Google定位函数吗,d和未排序correctly@MuhammadUmar请提供ping示例列表和
myLocation
的值,以便我们提供进一步帮助。
rhsLocation.setLatitude(Double.valueOf(rhs.latloc));  // It's rhs!
rhsLocation.setLongitude(Double.valueOf(rhs.lngloc)); // It's rhs!
float lhsDistance = lhsLocation.distanceTo(myLocation);
float rhsDistance = rhsLocation.distanceTo(myLocation);

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