我正在制作一个Android应用,它会列出不在Google地方的特定地点。我拥有所有纬度和经度以及地名,它们不会改变。我可以在我的自定义列表中显示它们并且它工作正常问题是我想要按距离(用户)位置对它们进行排序并显示它们旁边的距离。
我尝试了很多不同的方法但是有点卡住了。我想说我是编程的新手,有点磕磕绊绊地通过这个应用程序,如果有人可以提供帮助,那将非常感激。
所以问我的问题是我怎么能/应该按距离对位置进行排序,以便我可以将它们添加到我的自定义列表中。
// create array to hold place names to be looped through later
String[] placenames = { "place1", "place2",
"place3", "place4" };
// // create arrays to hold all the latitudes and longitudes
double[] latArray = new double[] { 51.39649, 51.659775, 51.585433,
51.659775 };
double[] lngArray = new double[] { 0.836523, 0.539901, 0.555385,
0.539901, };
// hard code my location for test purposes only
Location MyLocation = new Location("My location");
MyLocation.setLatitude(51.659775);
MyLocation.setLongitude(0.539901);
for (int i = 0; i < placenames.length;) {
// Place location object
Location PlaceName = new Location(placenames[i]);
PlaceName.setLatitude(latArray[i]);
PlaceName.setLongitude(lngArray[i]);
i++;
// calculate distance in meters
float distanceInMeters = PlaceName.distanceTo(MyLocation);
// convert to double
double DistanceInMiles = distanceInMeters * 0.000621371;
dimint = (int) DistanceInMiles;
// format numbers to two decimal places
DecimalFormat df = new DecimalFormat("#.##");
dim = df.format(DistanceInMiles);
//make treemap and then sortedmap to sort places by distance
TreeMap<Integer, String> treemap = new TreeMap<Integer, String>();
SortedMap<Integer, String> treemapsorted = new TreeMap<Integer,String>();
treemap.put(dimint, PlaceName.getProvider());
treemapsorted = treemap.subMap(0, 5);
// Toast for test purpose to see if sort is working
Toast tst = Toast.makeText(this, treemapsorted.entrySet()
.toString(), Toast.LENGTH_SHORT);
tst.show();
CustomList place_data[] = new CustomList[] {
// This is the problem part
new CustomList(R.drawable.picture1, treemapsorted.get(dimint)),
};
CustomListAdapter adapter = new CustomListAdapter(this,
R.layout.listview_item_row, place_data);
listView1 = (ListView) findViewById(R.id.listView1);
listView1.setAdapter(adapter);
;
}
答案 0 :(得分:0)
我刚刚审核了您的代码并发现了很多问题:
在for循环语句中使用i++
而不是在循环体中使用for (int i = 0; i < placenames.length; i++) {
}
,如下所示:
Math.round()
您计算以英里为单位的距离,将其转换为int(我会在此处使用TreeMap
),然后使用DecimalFormat创建一个您不使用的字符串。
您可以在每次循环迭代中创建一个TreeMap。将创建移动到循环前面,并在循环体中向其添加项目。
TreeMap
不适合此任务。我测试了你的代码,循环后Map只包含3个项目。原因是,TreeMap包含键值对,其中键必须是唯一的。添加一个带有键的元素(在您的情况下为距离)已经在地图中,导致覆盖该元素。因此,我推荐使用ArrayList
而不是Comparable<Class>
。您需要创建一个包含所需变量的类,例如距离和地名。该类需要实现接口public int compareTo(T other)
。然后,您必须实现方法Collections.sort(arrayList)
,在该方法中将距离与另一个对象的距离进行比较。然后,您可以使用ListView
对ArrayList进行排序。在for循环体中,您应该将项添加到该ArrayList,然后对其进行排序,然后迭代ArrayList项并将它们添加到{{1}}。