Как отсортировать HashMap (внутри ArrayList) в Android? - PullRequest
2 голосов
/ 26 февраля 2012

У меня есть Текущее местоположение Широта и Долгота со мной. Я получаю список банкоматов, находящихся рядом с пользователем, из веб-службы API Google Мест и храню свои данные в Arraylist, как показано ниже.

Фрагмент кода

double currentLat = xxx;
double currentLang = xxx;

при нажатии кнопки я вызываю веб-службу Google Места.

public void buttonClicked(View v) {
    ParseXMLData xmlData = new ParseXMLData();
    url = baseUrl + "location=" + latitude + "," + longitude + "&" + "radius=" + search_Area_Radius + "&" + "name=" + nameofplace + "&" + "sensor=true" + "&" + "key=" + API_KEY;
    xmlData.execute("");
}

Сохранение результата внутри arraylist ....

    for (int i = 0; i < nodes.getLength(); i++) {
        HashMap<String, String> map = new HashMap<String, String>();
        Element e = (Element)nodes.item(i);
        map.put("Name", XMLFunctions.getValue(e, "name"));
        map.put("Vicinity", XMLFunctions.getValue(e, "vicinity"));
        map.put("Latitude", XMLFunctions.getValue(e, "lat"));
        map.put("Longitude", XMLFunctions.getValue(e, "lng"));

        loc = new Location("");
        loc.setLatitude(Double.parseDouble(XMLFunctions.getValue(e, "lat")));
        loc.setLongitude(Double.parseDouble(XMLFunctions.getValue(e, "lng")));

Получение расстояния ч / б от 2 точек.

        distance = currentLoc.distanceTo(loc);
        map.put("Distance",String.valueOf(distance));
        mylist.add(map);
        loc = null;
        distance = 0.0;
    }

Реализован компаратор и отсортирован ArrayList

public class PositionComparator implements Comparator<HashMap<String, String>> {

    public PositionComparator() {
        // TODO Auto-generated constructor stub
    }


    public int compare(HashMap<String, String> o1, HashMap<String, String> o2) {
        /*System.out.println(o1.get("O1 Distance :- "));
        System.out.println(o2.get("O2 Distance :- "));
        System.out.println(o1.get("Distance").compareTo(o2.get("Distance")));
        */
        return o1.get("Distance").compareTo(o2.get("Distance"));
    }
}

Теперь происходит то, что данные, которые я храню в массиве, сортируются, но проблема заключается в том, что метод сравнения сравнивает данные только по 1-му символу. Предположим, что мои данные похожи на 2.12345 и 11.32545, тогда они будут заменены на 2-1 = 1.

Как это решить?

Если у кого-нибудь есть какие-либо предложения / советы по этому вопросу, пожалуйста, помогите мне в этом.

Спасибо

1 Ответ

3 голосов
/ 26 февраля 2012

Здесь идет поток , который описывает, как вы можете рассчитать расстояние между GPS-координатами.Он имеет реализации на многих языках, надеюсь, вы поймете некоторые из них.Тогда давайте предположим, что у вас есть функция calcDistance, которая возвращает Double - расстояние от текущей точки до хеш-карты вашего типа с использованием ее долготы и широты (кстати, требуется ли вам использовать такую ​​уродливую карту?вы создаете класс bean для той же цели).

Затем вам нужно объявить метод сравнения двух позиций, заданных их позициями:

public class PositionComparator implements Comparator<HashMap<String, String>> {
    public int compare(HashMap<String, String> o1, HashMap<String, String> o2) {
        return calcDistance(o1).compareTo(calcDistance(o2));
    }
}

И, наконец, сортировка выполненавот так:

Collections.sort(mylist, new PositionComparator());

Однако учтите, что если вы выполните сортировку таким образом, расстояние до каждого элемента будет вычислено несколько раз.Я рекомендую вам добавить еще одно поле на карте, в котором будет храниться расстояние, чтобы избежать его переоценки.

Последнее замечание: если вы решите переключить карту с помощью класса, вы можете легко сделать этот классреализовать интерфейс Comparable и определить там сравнение.

РЕДАКТИРОВАТЬ Добавление запрошенного примера компонента:

public class PositionBean implements Comparable {
   private double latitude;
   private double longitude;
   private distanceFromCurrentPosition;
   private String vicinity;
   private String name;
   // ...getters and setters ...

   public PositionBean(String latitude, String longitude, String vicinity,
            String name) {
       this.latitude = Double.valueOf(latitude);
       this.longitude = Double.valueOf(longitude);
       this.vicinity= vicinity;
       this.name = name;
       this.distanceFromCurrentPosition = calcDistance();
   }

   public int compareTo(Object anotherPositionObj) throws ClassCastException {
       if (!(anotherPositionObj instanceof PositionBean)) {
           throw new ClassCastException("A PositionBean object expected.");
       }
       int anotherPosition = (PositionBean) anotherPositionObj;  
       return Double.compare(this.getDistanceFromCurrentPosition(),
               anotherPosition.getDistanceFromCurrentPosition());    
   }

   private double calcDistance() {
       //...implement accordingly
   }
}

public static void main(String [] args) {
    List<PositionBean> positions = new ArrayList<PositionBean>();
    // ... Initialize the positions
    Collections.sort(positions);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...