2012-04-27 61 views
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没有属性“距离”。

即使我可以计算位置和用户之间的距离,我该如何排序呢?

UPDATE

这是最后的解决方案!就像一个魅力

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; 
    } 

回答

1

要么给VideoLocation场与一个Comparator的距离比较保存从用户的距离,计算出每个商家地点,然后排序,或者做一个Comparator,计算两个距离并比较它们。

第一种方法需要VideoLocation中您可能不想拥有的额外字段。第二种方法做了一些冗余计算(计算距离大约是2n log n次而不是n次)。拿你的选择;要么工作得很好,也不是所有昂贵。排序

@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; 
} 
+0

我刚刚更新了我的问题,请看看..谢谢 – hectichavana 2012-04-27 14:53:15

+0

正如Igor F.所说,你的新代码是错误的:你需要计算'lhs'和'rhs'的经度和纬度(在你' ),然后调用'countDistance(lat,lng,lat1,lng1)'和'countDistance(lat,lng,lat2,lng2)'(注意:'lat1'),然后调用另一个的纬度和经度。 'lng'1还不存在,但是当你同时计算lats和两个lng时!)。 – 2012-04-27 15:10:03

+0

我真的不知道它,你能提供一个改进或更正我刚发布的代码吗?这将有所帮助。 Thx – hectichavana 2012-04-27 15:26:24

2

至比较双打,你可以做到这一点。

+0

我刚刚更新了我的问题,请看看..谢谢 – hectichavana 2012-04-27 14:53:32

+0

thankx你救我的日子 – 2017-03-29 14:16:01

1

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

ArrayList的someList =新的ArrayList(getDoubleListFromSomewhere());

Collections.sort(someList,新比较<双>(){

公众诠释比较(双C1,C2双){

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

} 

});

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

Cheerz”

Cehm

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); 
+0

你是什么意思latUser和lngUser?因为lat和lng实际上属于用户 – hectichavana 2012-04-27 15:07:45

+0

如果我理解正确,您正试图根据它们与一个特殊对象(用户)的距离来对一组带有地理标记的对象进行排序。所以(lat,lng)和(lat2,lng2)是来自集合的两个对象的坐标,并且确定它们各自距离的距离(latUser,lngUser)。 – 2012-04-27 15:33:55

+0

谢谢,只是想出了我出错的地方。我用最终解决方案更新了我的问题 – hectichavana 2012-04-27 15:34:21

相关问题