簡體   English   中英

如何像其他排序列表一樣對 ArrayList 進行排序?

[英]How to sort ArrayList like other sorted list?

我有兩個ArrayList 一個是Double類型,包含距離。 另一種是String類型,包含城市類型。

這些是列表:

private ArrayList<Double> distance_list = new ArrayList<Double>();
distance.add(123.43);
distance.add(450.43);
distance.add(230.65);

private ArrayList<String> city_list = new ArrayList<String>();
city_list.add("Munich");
city_list.add("Berlin");
city_list.add("Frankfurt");

Collections.sort(distance_list); //to get the closest distance first

如何以與匹配距離相同的順序對city_list進行排序?

NavigableMap / SortedMap

請改用Map map 以鍵值關系將兩個項目配對在一起。 索要訪問其價值合作伙伴的密鑰。

使用NavigableMapSortedMap可以保持鍵的順序。

NavigableMap< Double , String > map = new TreeMap<>() ;
map.add( 123.43d , "Munich" ) ;
…

然后,您可以循環該 map。 請參閱:如何在 Java 中的 NavigableMap 中循環

for( Double key : map.keySet() )
{
    String city = map.get( key ) ;
    System.out.println( city + " = " + key ) ;
}

這是我制作的圖表圖形,作為與 Java 11 捆綁的Map實現的概述。您可以看到首先添加了SortedMap接口,然后通過NavigableMap接口進行了擴展。

在此處輸入圖像描述

您需要創建一個 class 將兩個值配對並實現 Comparable 接口,例如:

public class City implements Comparable<City> {

    private Double distance;
    private String name;

    // constructor, getters, setters

    @Override
    public int compareTo(City city) {
        return (double)(this.distance - city.getDistance());
    }
}

然后構建一個 Treemap 或其他一些 Map 類型,以保持事物的排序。 我假設您希望按距離排序。

//Create TreeMap
TreeMap<Double, String> cities = new TreeMap();

//Add cities
cities.put(123.43, "Munich");

這些項目將按距離值排序!

如果您需要更多幫助,請嘗試並發布您的代碼。

您可以分兩步完成

  • 您創建一個 englobing class
    • class 必須實現 Comparable(在 Collections.sort() 中使用)
  • 然后你用 Collections.sort() 排序
class DistanceCity implements Comparable<DistanceCity>  {
    private Double distance;
    private String city;

    public DistanceCity(Double distance, String city) {
        this.distance = distance;
        this.city = city;
    }

    @Override
    public int compareTo(DistanceCity o) {
        return distance.compareTo(o.distance);
    }

    @Override
    public String toString() {
        return "DistanceCity{" + "distance=" + distance + ", city='" + city + "'}";
    }
}
private ArrayList<DistanceCity> liste;
liste = new ArrayList<>();
liste.add(new DistanceCity(123.43,"Munich"));
liste.add(new DistanceCity(450.43,"Berlin"));
liste.add(new DistanceCity(230.65,"Frankfurt"));

System.out.println(liste); // unordered
//[DistanceCity{distance=123.43, city='Munich'}, DistanceCity{distance=450.43, city='Berlin'}, DistanceCity{distance=230.65, city='Frankfurt'}]

Collections.sort(liste);

System.out.println(liste); // ordered
// [DistanceCity{distance=123.43, city='Munich'}, DistanceCity{distance=230.65, city='Frankfurt'}, DistanceCity{distance=450.43, city='Berlin'}]

帶有 Comparable 和示例的完整實現

class City implements Comparable<City>{
  public String name = null;
  public Double distance = 0.0;

  public City(String name, Double distance){
    this.name = name;
    this.distance = distance;
  }

  @Override
  public int compareTo(City o){
    return this.distance.compareTo( o.distance );
  }

  @Override
  public String toString(){
    return this.name;
  }

}


public class CitiesDemo{
  public static void main (String[] args ){
  City munich = new City("Munich", 123.43);
  City berlin = new City("Berlin", 450.43);
  City frankfurt = new City("Frankfurt", 230.65);

  java.util.List<City> cities = new java.util.ArrayList<City>();
  cities.add( munich );
  cities.add( berlin );
  cities.add( frankfurt );
  java.util.Collections.sort( cities );
  System.out.println( cities );
  }

}

將返回:

~/ (main)$ javac CitiesDemo.java 

~/ (main)$ java CitiesDemo

[Munich, Frankfurt, Berlin]

~/ (main)$ 

或者,您可以在這里進行測試: https://ideone.com/fbbLv6

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM