【问题标题】: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】:
      1. 您可以使用预定义的方法比较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()));
        
      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类中实现接口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());
            }
        }
        

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-24
        • 2021-08-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多