如何通过双重属性对数组进行排序?

时间:2012-04-27 13:56:12

标签: android

我有一个由以下数组对象填充的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(){

    }

我需要根据Location和User之间的距离对ListActivity进行排序。 我按字母顺序排序'name'字符串没有任何问题,我使用这种方法:

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

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

但该方法不能用于'double'数据类型,我需要'纬度'和'经度'。此外,对象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;
    }

5 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:1)

VideoLocation提供一个字段以保持与用户的距离,计算每个位置的距离,然后使用比较距离的Comparator进行排序,或者制作Comparator计算两个距离并比较它们。

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

  

ArrayList someList = new ArrayList(getDoubleListFromSomewhere());

     

Collections.sort(someList,new Comparator&lt; Double&gt;(){

     

public int compare(Double c1,Double c2){

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

}
     

});

之后你的双重值列表应该全部排序......

Cheerz'

Cehm

答案 4 :(得分: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);