![](/img/trans.png)
[英]How to convert this "Sort object field case insensitively" from a Comparator class to a lambda?
[英]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));
您可以使用預定義的方法比較 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()));
您可以指定自定義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()); } }
您可以在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.