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(){

    }

Location と User の間の距離に基づいて ListActivity をソートする必要があります。「名前」文字列をアルファベット順に並べ替えるのに問題はありません。次の方法を使用します。

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

5 に答える 5

2

double で比較するには、次のようにします。

@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

または、次のような強力なツールを使用できますCollections...

ArrayList someList = new ArrayList(getDoubleListFromSomewhere());

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

public int compare(Double c1、Double c2){

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

}

});

その後、double値のリストをすべてソートする必要があります...

Cheerz '

セーム

于 2012-04-27T14:23:11.497 に答える
1

lhsDistanceとrhsDistanceは常に同じであるため、コードは常に0を返します。

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 に答える
1

VideoLocationユーザーからの距離を保持するフィールドを指定し、各場所についてそれを計算してから、距離を比較する で並べ替えるComparatorか、両方Comparatorの距離を計算して比較する を作成します。

最初のアプローチでは、不要な追加のフィールドが に必要VideoLocationです。2 番目のアプローチでは、冗長な計算が行われます (n 回ではなく 2n log n 回のような距離の計算)。好きなのを選びな; どちらも問題なく動作し、どちらもそれほど高価ではありません。

于 2012-04-27T14:02:48.087 に答える
1

このメソッドを使用してLocation.distanceBetween()、2 点とユーザーの間の距離を取得し、それを並べ替えることができます。

于 2012-04-27T14:04:49.750 に答える