【问题标题】:How to sort by a field of class with its own comparator?如何通过具有自己的比较器的类字段进行排序?
【发布时间】:2021-04-05 16:07:21
【问题描述】:
我有一个示例类,比如Country:
class Country {
public String name;
public int population;
public Flag flag;
...
}
我在其他地方定义了这个 Flag 类
class Flag {
String id;
int pixel;
...
}
现在我创建一个单独的比较器 DefaultFlagRankingComparator(),它可以按 id 对标志进行排序。如何使用此 DefaultFlagRankingComparator() 按标志 id 对国家/地区列表进行排序?
【问题讨论】:
标签:
java
list
sorting
object
comparator
【解决方案1】:
您可以调用Comparator的比较方法与每个国家的标志字段。
DefaultFlagRankingComparator flagComparator =
new DefaultFlagRankingComparator();
Collections.sort(countries, (a, b) ->
flagComparator.compare(a.getFlag(), b.getFlag()));
您还可以使用Comparator.comparing 创建一个Comparator,使用一个密钥提取函数和一个比较这些密钥的Comparator(如Louis Wasserman 所建议的那样)。
DefaultFlagRankingComparator flagComparator =
new DefaultFlagRankingComparator();
Collections.sort(countries,
Comparator.comparing(Country::getFlag, flagComparator));
【解决方案2】:
-
您可以使用预定义的方法比较String id 的值:
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类中实现接口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());
}
}