java—如何使用自己的比较器按类字段排序?

eagi6jfj  于 2021-06-29  发布在  Java
关注(0)|答案(2)|浏览(382)

比如说,我有一个示例类 Country :

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

我有这个 Flag 在其他地方定义的类

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

现在,我创建一个单独的比较程序defaultflagrankingcomparator(),它可以按id对国旗进行排序。如何使用这个defaultflagrankingcomparator()按国旗id对国家/地区列表进行排序?

zxlwwiss

zxlwwiss1#

你可以比较一下 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());
    }
}

您可以实现接口 ComparableFlag 班级:

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());
    }
}
fykwrbwg

fykwrbwg2#

您可以调用 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));

相关问题