Java 按距离排序数组

Java 按距离排序数组,java,android,arrays,google-maps,Java,Android,Arrays,Google Maps,我有一个包含字段、纬度和经度的数据库 我将通过这个函数获取bd,并将其转换为数组 ArrayList<PontoEntity> array = new ArrayList<PontoEntity>(); Cursor c = com.vianaturismo.db.DBMain.getAll(getApplicationContext(), DALPonto.TABLE_NAME, DALPonto.columns); array = DALPonto.co

我有一个包含字段、纬度和经度的数据库

我将通过这个函数获取bd,并将其转换为数组

ArrayList<PontoEntity> array = new ArrayList<PontoEntity>();       
Cursor c = com.vianaturismo.db.DBMain.getAll(getApplicationContext(), DALPonto.TABLE_NAME, DALPonto.columns);
array = DALPonto.converte(c);

我在这方面的困难是按距离排列的。也就是说,按最近的点排序。

您需要查看这个答案,它演示了如何构造按距离排序的
order by
语句


我可能会这样做

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.ListIterator;

public class SortByDistance{
    public static void main(String[] args) {
        // TODO: initialize these
        List<Location> locations = new ArrayList<>();
        final Location myLocation = null;

        sort(locations, new ToComparable<Location, Double>() {
            @Override
            public Double toComparable(Location location) {
                return Location.distance(location, myLocation);
            }
        });

        for (Location location : locations)
            System.out.println(location);
    }

    protected static class Location {
        private final double latitude, longitude;

        public Location(double latitude, double longitude) {
            this.latitude = latitude;
            this.longitude = longitude;
        }

        public Double getLatitude() {
            return latitude;
        }

        public Double getLongitude() {
            return longitude;
        }

        @Override
        public String toString() {
            return String.format("[latitude = %f, longitude = %f]", latitude, longitude);
        }

        public static double distance(Location location1, Location location2) {
            // TODO: return the distance between location1 and location2
            return 0;
        }
    }

    public interface ToComparable<T, C extends Comparable<? super C>> {
         C toComparable(T t);
    }

    public static <T, C extends Comparable<? super C>> void sort(List<T> list, ToComparable<T, C> function) {
       class Pair implements Comparable<Pair> {
          final T original;
          final C comparable;

          Pair(T original, C comparable) {
             this.original = original;
             this.comparable = comparable;
          }

          @Override
          public int compareTo(Pair pair) {
              return comparable == null ? 
                pair.comparable == null ? 0 : -1 :
                pair.comparable == null ? 1 : comparable.compareTo(pair.comparable);
          }
       }

       List<Pair> pairs = new ArrayList<>(list.size());
       for (T original : list)
          pairs.add(new Pair(original, function.toComparable(original)));

       Collections.sort(pairs);

       ListIterator<T> iter = list.listIterator();
       for (Pair pair : pairs) {
          iter.next();
          iter.set(pair.original);
       }
    }
}
import java.util.ArrayList;
导入java.util.Collections;
导入java.util.List;
导入java.util.ListIterator;
公共类排序距离{
公共静态void main(字符串[]args){
//TODO:初始化这些
列表位置=新的ArrayList();
最终位置myLocation=null;
排序(位置,新到可比较(){
@凌驾
公共双ToCompable(位置){
返回位置。距离(位置、位置);
}
});
对于(位置:位置)
系统输出打印项次(位置);
}
受保护的静态类位置{
私人最终双纬度、经度;
公共位置(双纬度、双经度){
这个。纬度=纬度;
这个经度=经度;
}
公共双纬度(){
返回纬度;
}
公共双getLongitude(){
返回经度;
}
@凌驾
公共字符串toString(){
返回String.format(“[latitude=%f,longitude=%f]”,latitude,longitude);
}
公共静态双距离(位置1、位置2){
//TODO:返回位置1和位置2之间的距离
返回0;
}
}

可比较的公共界面我所做的是,假设你有一系列的地方

private List<Places> placesList = new ArrayList<Places>();
然后,您应该做的是,首先检查所有阵列,以找到每个位置与您的位置之间的距离:

for ( Place tempPlace: placeList)
{
    tempLocation = new Location("");    
    tempLocation.setLatitude(Double.parseDouble(tempPlace.getPlaceLat()));
    tempLocation.setLongitude(Double.parseDouble(tempPlace.getPlaceLng()));
    float distance = currentUserLocation.distanceTo(tempLocation);
    distance = distance/1000;
    tempPlace.setPlaceDistance(distance);
}
最后,按距离对该数组进行排序:

Collections.sort(placeList, new Comparator<Place>() {
            @Override
            public int compare(Place c1, Place c2) {
                return new Float(c1.getPlaceDistance()).compareTo(new Float(c2.getPlaceDistance()));
            }
        });
Collections.sort(placeList,newcomparator(){
@凌驾
公共整数比较(位置c1,位置c2){
返回新浮点(c1.getPlaceDistance()).compareTo(新浮点(c2.getPlaceDistance());
}
});

如果您的问题在于数据排序,请参阅:
for ( Place tempPlace: placeList)
{
    tempLocation = new Location("");    
    tempLocation.setLatitude(Double.parseDouble(tempPlace.getPlaceLat()));
    tempLocation.setLongitude(Double.parseDouble(tempPlace.getPlaceLng()));
    float distance = currentUserLocation.distanceTo(tempLocation);
    distance = distance/1000;
    tempPlace.setPlaceDistance(distance);
}
Collections.sort(placeList, new Comparator<Place>() {
            @Override
            public int compare(Place c1, Place c2) {
                return new Float(c1.getPlaceDistance()).compareTo(new Float(c2.getPlaceDistance()));
            }
        });