亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

通過與一個條目進行比較來查找列表中最近的條目

通過與一個條目進行比較來查找列表中最近的條目

慕沐林林 2022-09-22 19:25:59
我有一個類,里面有很多字段,如下所示:Unitpublic class Unit {  private final int id;  private final int beds;  private final String city;  private final double lat;  private final double lon;  // constructors and getters here  // toString method}我現在有一個列表,其中是一個包含許多單位的對象?,F在我需要找到從對象到 最近的單位。通過限制限制結果。UnitListListUnit x  private List<Unit> nearestUnits(List<Unit> lists, Unit x, int limit) {    List<Unit> output = new ArrayList<>();    // how do I sort lists object in such a way so that I can get nearest units here to "x"?    return output;  }我們在類中存在緯度/經度,因此我們可以使用它來計算歐氏距離并進行比較。我對如何按最短距離對單位列表進行排序并獲取最近的單位感到困惑。到目前為止,我正在使用 Java 7,所以我不能使用 Java 8。Unit
查看完整描述

2 回答

?
臨摹微笑

TA貢獻1982條經驗 獲得超2個贊

你說你知道如何計算距離,所以我下面的代碼不包括計算,所以我假設你可以實現這個方法。我使用自動對添加到其中的條目和類實現進行排序,因此您無需處理排序。將返回按計算的距離排序的鍵。calculateDistance()TreeMapDoubleComparableIterator


private List<Unit> nearestUnits(List<Unit> lists, Unit x, int limit) {

    TreeMap<Double, Unit> sorted = new TreeMap<>();

    List<Unit> output = new ArrayList<>();

    for (Unit unit : lists) {

        Double distance = calculateDistance(unit, x);

        sorted.put(distance, unit);

    }

    Set<Double> keys = sorted.keySet();

    Iterator<Double> iter = keys.iterator();

    int count = 0;

    while (iter.hasNext() && count < limit) {

        Double key = iter.next();

        Unit val = sorted.get(key);

        output.add(val);

        count++;

    }

    return output;

}


查看完整回答
反對 回復 2022-09-22
?
PIPIONE

TA貢獻1829條經驗 獲得超9個贊

此距離方法參考自 https://stackoverflow.com/a/16794680/6138660

public static double distance(double lat1, double lat2, double lon1,

        double lon2) {

    final int R = 6371; // Radius of the earth


    double latDistance = Math.toRadians(lat2 - lat1);

    double lonDistance = Math.toRadians(lon2 - lon1);

    double a = Math.sin(latDistance / 2) * Math.sin(latDistance / 2)

            + Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2))

            * Math.sin(lonDistance / 2) * Math.sin(lonDistance / 2);

    double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));

    double distance = R * c * 1000; // convert to meters


    distance = Math.pow(distance, 2);


    return Math.sqrt(distance);

}


private List<Unit> nearestUnits(List<Unit> lists, Unit x, int limit) {



    lists.sort(new Comparator<Unit>() {


        @Override

        public int compare(Unit o1, Unit o2) {


            double flagLat = x.getLat();

            double flagLon = x.getLon();


            double o1DistanceFromFlag = distance(flagLat, o1.getLat(), flagLon, o1.getLon());

            double o2DistanceFromFlag = distance(flagLat, o2.getLat(), flagLon, o2.getLon());


            return Double.compare(o1DistanceFromFlag, o2DistanceFromFlag);

        }

    });


    return lists.subList(0, limit);;

  }


查看完整回答
反對 回復 2022-09-22
  • 2 回答
  • 0 關注
  • 167 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號