我有目前的位置纬度和经度与我。我正在从googleplacesapiweb服务中获取用户附近的atm列表,并将数据存储在下面这样的arraylist中。
代码段
double currentLat = xxx;
double currentLang = xxx;
按一下按钮,我调用google places的web服务。
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两点的距离。
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中存储的数据被排序,但问题是比较方法排序数据只基于第一个字符。假设我的数据是2.12345和11.32545,那么它将替换为2-1=1。
如何解决这个问题?
如果有人对此有任何建议/建议,请帮助我。
谢谢
最佳答案
这里是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);
}