我有一个由以下数组对象填充的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;
}
答案 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);