簡體   English   中英

如何使用自己的比較器按 class 的字段排序?

[英]How to sort by a field of class with its own comparator?

我有一個示例 class,比如Country

class Country {
    public String name;
    public int population;
    public Flag flag;  
    ...                                                                        
}

我在其他地方定義了這個Flag class

class Flag {
    String id;
    int pixel;
    ...
}

現在我創建了一個單獨的比較器 DefaultFlagRankingComparator(),它可以按 id 對標志進行排序。 如何使用此 DefaultFlagRankingComparator() 按標志 ID 對國家/地區列表進行排序?

您可以調用Comparator的 compare 方法與每個國家的 flag 字段。

DefaultFlagRankingComparator flagComparator =
        new DefaultFlagRankingComparator();
Collections.sort(countries, (a, b) ->
        flagComparator.compare(a.getFlag(), b.getFlag()));

您還可以使用Comparator.comparing使用提取 function 的密鑰和比較這些密鑰的Comparator創建一個Comparator (如Louis Wasserman所建議)。

DefaultFlagRankingComparator flagComparator =
        new DefaultFlagRankingComparator();
Collections.sort(countries,
        Comparator.comparing(Country::getFlag, flagComparator));
  1. 您可以使用預定義的方法比較 id 的String值:

     Arrays.sort(countries, (c1, c2) -> Objects.compare( c1.getFlag().getId(), c2.getFlag().getId(), Comparator.naturalOrder()));
     Arrays.sort(countries, Comparator.comparing(country -> country.getFlag().getId(), Comparator.naturalOrder()));
  2. 您可以指定自定義Comparator

     Arrays.sort(countries, Comparator.comparing(country -> country.getFlag(), new DefaultFlagRankingComparator()));
     static class DefaultFlagRankingComparator implements Comparator<Flag> { @Override public int compare(Flag o1, Flag o2) { return Objects.compare(o1.getId(), o2.getId(), Comparator.naturalOrder()); } }
  3. 您可以在Flag class 中實現接口Comparable

     Arrays.sort(countries, Comparator.comparing(Country::getFlag));
     static class Flag implements Comparable<Flag> { String id; public String getId() { return id; } @Override public int compareTo(Flag that) { return Objects.compare(this.getId(), that.getId(), Comparator.naturalOrder()); } }

暫無
暫無

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

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