0

我正在制作一个 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);
        ;
    }
4

1 回答 1

0

我刚刚查看了您的代码,发现了很多问题:

  1. 在你的 for 循环语句中使用i++,而不是在循环体中使用,如下所示:

    for (int i = 0; i < placenames.length; i++) {
    
    }
    
  2. 您以英里为单位计算距离,将其转换为 int(我将Math.round()在此处使用),然后使用您不使用的 DecimalFormat 创建一个字符串。

  3. 您在每次循环迭代中创建一个 TreeMap。将创建移动到循环前面并在循环主体中向其添加项目。

  4. TreeMap不是此任务的正确班级。我测试了您的代码,循环后 Map 仅包含 3 个项目。原因是 TreeMap 包含键值对,其中键必须是唯一的。添加一个带有键(在您的情况下为距离)的元素,该元素已经在地图中,会导致覆盖该元素。因此,TreeMap我建议使用ArrayList. 您需要使用所需的所有变量创建一个类,例如距离和地名。这个类需要实现接口Comparable<Class>。然后,您将必须实现将public int compareTo(T other)距离与另一个对象的距离进行比较的方法。然后您可以使用 ArrayList 对 ArrayList 进行排序Collections.sort(arrayList). 在 for 循环体中,您应该将项目添加到该 ArrayList,然后对其进行排序,然后遍历 ArrayList 项目并将它们添加到您的ListView.

于 2013-06-06T20:12:32.297 回答