2012-02-26 2 views
2

У меня есть текущее местоположение Широта & Долгота со мной. Я получаю список банкоматов рядом с пользователем из веб-службы API Google и сохраняю данные в Arraylist, как показано ниже.Как сортировать HashMap (внутри ArrayList) в Android?

Код сниппета

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

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

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

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

Благодаря

+0

это слишком много работы, чтобы сравнить результаты в ArrayList и хранить их в массиве в порядке, который вы хотите увидеть их? После запуска запроса и получения результатов вы знаете, сколько элементов должен иметь массив. –

ответ

3

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

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

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 и определить его сравнение.

EDIT Добавление запрошенного примера компонента:

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

Большое спасибо за ваш быстрый ответ. Предположим, что я создаю методы Bean (Name, Vicinity, Lat, Land, Distance with getter & setter). Как использовать интерфейс Comparable? Можете ли вы просто дать мне общую идею? – Scorpion

+1

Конечно. Я добавил пример. Однако, пожалуйста, простите меня, если я сделал небольшие ошибки ввода, потому что я непосредственно заполнял текстовый редактор. Напишите назад, если возникнут проблемы. –

+0

Спасибо, что его сделали ..... – Scorpion

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