0

我有一个由以下数组对象填充的 ListActivity:

public class VideoLocation {

    public String deleted_at = null;
    public int documentary_video_length = -1;
    public int id = -1;
    public double latitude = 0d;
    public double longitude = 0d;
    public int position = -1;
    public String updated_at = null;
    public String name = null;
    public String text = null;
    public String documentary_video_url = null;
    public String documentary_thumbnail_url = null;
    public String audio_text_url = null;
    public Footage[] footages = null;

    public VideoLocation(){

    }

我需要根据位置和用户之间的距离对 ListActivity 进行排序。我按字母顺序对“名称”字符串进行排序没有任何问题,我使用这种方法:

public void sortAZ(){
    Arrays.sort(videoLocations, new Comparator<VideoLocation>() {

        @Override
        public int compare(VideoLocation lhs, VideoLocation rhs) {
            return lhs.name.compareTo(rhs.name);
        }
    });
}

但该方法不能用于“双”数据类型,我需要“纬度”和“经度”。此外,对象 VideoLocation 没有属性“距离”。

即使我可以计算位置和用户之间的距离,我如何才能解决它?

更新

这是最终解决方案!奇迹般有效

public void sortNearby(){
        Arrays.sort(videoLocations, new Comparator<VideoLocation>() {

            @Override
            public int compare(VideoLocation lhs, VideoLocation rhs) {

                double lat = location.getLatitude();
                double lng = location.getLongitude();

                double lat1 = lhs.latitude;
                double lng1 = lhs.longitude;

                double lat2 = rhs.latitude;
                double lng2 = rhs.longitude;

                double lhsDistance = countDistance(lat,lng,lat1,lng1);
                double rhsDistance = countDistance(lat,lng,lat2,lng2);
                if (lhsDistance < rhsDistance) 
                    return -1;
                else if (lhsDistance > rhsDistance) 
                    return 1;
                else return 0;
            }
        });
    }

public double countDistance(double lat1,double lng1, double lat2, double lng2)
    {
        Location locationUser = new Location("point A");
        Location locationPlace = new Location("point B");
        locationUser.setLatitude(lat1);
        locationUser.setLongitude(lng1);
        locationPlace.setLatitude(lat2);
        locationPlace.setLongitude(lng2);

        double distance = locationUser.distanceTo(locationPlace);

        return distance;
    }
4

5 回答 5

2

要比较双打,你可以这样做:

@Override
public int compare(VideoLocation lhs, VideoLocation rhs) {
    double lhsDistance = ...
    double rhsDistance = ...
    if (lhsDistance < rhsDistance) return -1;
    else if (lhsDistance > rhsDistance) return 1;
    else return 0;
}
于 2012-04-27T14:03:01.020 回答
1

要么给出VideoLocation一个字段来保存与用户的距离,计算每个位置Comparator的距离,然后用比较距离的 a 进行排序,或者制作一个Comparator计算两个距离并比较它们的 a。

第一种方法需要一个VideoLocation您可能不想拥有的额外字段。第二种方法进行一些冗余计算(计算距离类似于 2n log n 次而不是 n 次)。任君挑选;两者都可以正常工作,而且都不是那么昂贵。

于 2012-04-27T14:02:48.087 回答
1

您可以使用该Location.distanceBetween()方法获取两点与用户之间的距离,然后对其进行排序。

于 2012-04-27T14:04:49.750 回答
1

或者你可以使用一些强大的工具,比如Collections......

ArrayList someList = new ArrayList(getDoubleListFromSomewhere());

Collections.sort(someList, new Comparator < Double>() {

公共 int 比较(双 c1,双 c2){

  return c1.getName().compareTo(c2.getName());

}

});

之后,您的双精度值列表应全部排序...

干杯'

切姆

于 2012-04-27T14:23:11.497 回答
1

您的代码始终返回 0,因为 lhsDistance 和 rhsDistance 始终相同:

double lhsDistance = countDistance(lat,lng,lat2,lng2);
double rhsDistance = countDistance(lat,lng,lat2,lng2);

您没有提供足够的信息,但我想您想比较用户与许多不同位置之间的距离,例如:

double lhsDistance = countDistance(latUser, lngUser, lat, lng);
double rhsDistance = countDistance(latUser, lngUser, lat2, lng2);
于 2012-04-27T15:03:59.323 回答