如何在Android中对HashMap(在ArrayList内)进行排序?

时间:2012-02-26 09:09:44

标签: android arraylist hashmap sorting

我有当前位置Latitude&经度和我在一起。我从Google Places API Web服务获取用户附近的ATM列表,并将我的数据存储在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")));

在这里获得距离b / w 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方法排序数据仅基于第一个字符。假设我的数据类似于2.12345和11.32545,那么它将替换为2-1 = 1.

如何解决这个问题?

如果有人对此有任何建议/提示,请在此帮助我。

由于

1 个答案:

答案 0 :(得分:3)

这里有thread,它描述了如何计算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接口并在那里定义比较。

编辑添加所请求的bean示例:

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