Java 根据阵列的地理位置对其进行排序
我在定制模型中有一个带有lat和lng的阵列。我想对数组进行排序,以便距离我所在位置的最小距离位于顶部位置,依此类推 这是我试过的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
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;
}