- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有当前位置纬度和经度。我正在从 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/
将一个数组列表分配给另一个数组列表与在两个数组列表之间使用 addAll 方法有什么区别? 1 > arrayList = arrayList;//应该将后面的arrayList的值分配给第一个。 2
所以我在将 ArrayList 添加到我的 ArrayList 时遇到了一些问题。将其想象成一张 table 。 下面是一些示例代码: ArrayList currentRow = new Arra
我一直在尝试转换 ArrayList> to ArrayList> 的字符串 这是我尝试构建的代码。 public void convertString (ArrayList> templist) {
我有一个 ArrayList (alal) 和一个 ArrayList(al) 的 ArrayList。我想将 al 插入 alal,但我希望 alal.get(0) 包含 al 拥有的所有内容以及添
很抱歉标题太长,如果您能想到更好的标题,请告诉我! 我正在做的是尝试创建一个 ArrayList 的 ArrayList 并将 ArrayList 逐个添加到其中。两个AL>我所拥有的称为三角形和正方
我有带有值的 mList2。存在具有相同 id 的值。如何获取具有相同 id 的对象分组的 List 或 ArrayList 并将其添加到 ArrayList>? List mList2 = list
我正在创建一个 ArrayList的 ArrayList并添加 ArrayLists给它。但每次我对 ArrayList 进行更改时, 它反射(reflect)在 ArrayList 中. 示例: L
谁能解释一下ArrayList之间的区别是什么? , ArrayList和 ArrayList是什么时候使用它们?它们在实现层面上是相同的还是各自具有不同的含义? 最佳答案 ArrayList 特别是
这个问题在这里已经有了答案: Java generics: List> = new LinkedList>() is prohibited? (3 个答案) 关闭 9 年前。 为什么这段代码可以编译
我的 arraylistS 在覆盖数组列表中的行为类似于同一个实例。 我用其中一个来操作 i=0; manupulate((ArrayList)theCoveringRootArrayList.get
我们遇到这个错误 java.lang.NullPointerException at java.util.ArrayList.(Unknown Source) at de.mystuf
据我了解,ArrayList 类继承其父“List”类的 equals() 函数来查找两个成员对象是否相同。这是否意味着“contains()”线性搜索(使用“equal”)来查找 ArrayList
这个问题已经有答案了: What is the diamond operator in Java? (2 个回答) 已关闭 7 年前。 正如标题所说,在Java中,这两种语句有什么区别吗? 通常我都能
我正在尝试求解帕斯卡三角形。我有两个用 Java 编写的代码片段,第一个创建 inner ArrayList 几次并且对我来说效果很好。 但是在代码的第二个版本中,如果我修改 inner ArrayL
正如标题所示,我有两个 ArrayList。奇怪的是,在一个数组列表上设置一个值会改变另一个数组列表的值。 一些信息:这些是 Entry 类型的 ArrayList,每个列表都包含一个金额和一个值(这
我已经添加了一个项目到列表 a,然后添加了列表 a 到列表 b 并再次做了同样的事情。 我的问题是,如果我打印 b.get(0) 和 b.get(1),我会得到相同的列表,这两个项目都是 “一”和“二
我正在创建一个 ArrayList of ArrayList of ArrayList 的 ArrayList 并按以下方式填充它。它正确地填充它。我已经通过调试和 println 弄清楚了这一点。但
实现可以在 Arraylist 和 Integer 中存储任何级别的 ArrayList 的 ArrayList 的最佳方法是什么。 List> list = ArrayList(); 仅允许列表中最
在下面的示例中,我将如何将 ArrayList al4 的内容与其他 ArrayList 中的任何一个进行比较?以同样的方式,我将 al1 与 al2 进行了比较。 import java.util.
好的,所以我之前发布了一个线程,它回答了我的很多问题并帮助我改进了我的代码,但是,我遇到了另一个问题,我不知道为什么,但我认为也许该副本只是指向原始对象..(尽管我已尽力避免这种情况) 在我的游戏代码
我是一名优秀的程序员,十分优秀!