2012-04-27 4 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 раз). Выбирайте; либо будет работать нормально, и ни один из них не является , что дорого.

+0

Я только что обновил свой вопрос, PLS посмотрите .. спасибо – hectichavana

+0

Как говорит Игорь Ф., ваш новый код глючит: вам нужно вычислить широту и долготу как 'lhs', так и' rhs' (на тот момент, перечислив широту одного и долготу другого!), а затем вызовите 'countDistance (lat, lng, lat1, lng1)' и 'countDistance (lat, lng, lat2, lng2)' (примечание: 'lat1' и 'lng'1 еще не существует, но они будут, когда вы будете вычислять как латы, так и обе lngs!). –

+0

Я еще не понял, не могли бы вы улучшить или исправить код, который я только что написал? Это было бы полезно. Thx – hectichavana

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

Я только что обновил свой вопрос, посмотрел PLS .. спасибо – hectichavana

+0

thankx вы экономите свой день –

1

вы можете использовать метод Location.distanceBetween(), чтобы получить расстояние между двумя точками и пользователем, а затем сортировать по этому вопросу.

1

Или вы могли бы использовать некоторые мощные инструменты, такие как Collections ...

ArrayList someList = новый ArrayList (getDoubleListFromSomewhere());

Collections.sort (someList, новый Компаратор < Double>() {

общественного ИНТ сравнить (Double c1, c2 Double) {

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

+0

Если я правильно понимаю, вы пытаетесь сортировать коллекцию объектов с геотегами в соответствии с их расстоянием от одного специального такого объекта: пользователя. Итак, (lat, lng) и (lat2, lng2) являются координатами двух объектов из коллекций, и вы определяете, насколько далеко от них каждый (latUser, lngUser). –

+0

спасибо, просто понял, где я ошибся. Я обновил свой вопрос с окончательным решением – hectichavana

Смежные вопросы