gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 09:09:21 26 4
gpt4 key购买 nike

我有当前位置纬度和经度。我正在从 Google places API Web 服务获取用户附近的 ATM 列表,并将我的数据存储在 Arraylist 中,如下所示。

代码 fragment

double currentLat = xxx;
double currentLang = xxx;

点击按钮我调用 google places 的网络服务。

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

将结果存储在数组列表中....

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

现在发生的是我存储在数组列表中的数据已排序,但问题是 compareTo 方法仅根据第一个字符对数据进行排序。假设我的数据是 2.12345 和 11.32545 那么它将替换为 2-1 = 1。

如何解决?

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

谢谢

最佳答案

这是thread描述了如何计算 gps 坐标之间的距离。它具有多种语言的实现,希望您能理解其中的一些。然后假设您有一个返回 Double 的函数 calcDistance - 使用经度和纬度从当前点到您的类型的 HashMap 的距离(顺便说一句,它是否要求您使用这么丑陋的 map ?你不能为同样的目的创建一个 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());

但是请注意,如果您以这种方式实现排序,那么到每个元素的距离将被计算多次。我建议您在存储距离的 map 中多添加一个字段,以免重新计算它。

最后一点:如果你决定用一个类来切换 map ,你可以很容易地让这个类实现 Comparable 接口(interface)并在那里定义比较。

编辑 添加请求的 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);
}

关于android - 如何在 Android 中对 HashMap(在 ArrayList 中)进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9451848/

26 4 0