【Comparator】自定义sort规则(比较器的实现)

文章介绍了如何使用Java的Comparator接口来实现自定义排序。通过创建外部类或使用匿名内部类重写compare方法,可以按特定规则(如金牌、银牌、铜牌数量降序)对国家的奖牌进行排序。示例代码展示了这两种方法的具体实现。

目录

原理

示例实现了什么?

 首先演示一个外部类实现比较器方式

匿名内部类写法


原理

  Comparator接口是用于定义对象之间的比较规则的。当我们调用Arrays.sort方法时,它会根据提供的比较器(Comparator)来判断对象的顺序,从而实现自定义的排序功能。通过重写Comparator接口中的compare方法,我们可以指定对象之间的比较方式。

示例实现了什么?

首先传入了要排序的国家的数量

根据传入的数量进行循环输入,金牌、银牌、铜牌的数量用空格隔开

最后按照奖牌数量降序输出每个国家的金牌、银牌和铜牌数量。

 首先演示一个外部类实现比较器方式

具体就是创建一个

package Test;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.print("请输入国家数量:");
        int countryCount = scanner.nextInt();

        List<Country> countries = new ArrayList<>();
        for (int i = 0; i < countryCount; i++) {
            System.out.print("请输入第 " + (i + 1) + " 个国家的奖牌数量(金牌 银牌 铜牌):");
            int gold = scanner.nextInt();
            int silver = scanner.nextInt();
            int bronze = scanner.nextInt();
            countries.add(new Country(gold, silver, bronze));
        }

        CountryComparator comparator = new CountryComparator();
        countries.sort(comparator);

        for (Country country : countries) {
            System.out.println(country.gold + " " + country.silver + " " + country.bronze);
        }
    }
}

class Country {
    int gold;
    int silver;
    int bronze;

    public Country(int gold, int silver, int bronze) {
        this.gold = gold;
        this.silver = silver;
        this.bronze = bronze;
    }
}

class CountryComparator implements Comparator<Country> {
    @Override
    public int compare(Country c1, Country c2) {
        if (c1.gold != c2.gold) {
            return c2.gold - c1.gold; // 金牌数量降序排序
        } else if (c1.silver != c2.silver) {
            return c2.silver - c1.silver; // 银牌数量降序排序
        } else {
            return c2.bronze - c1.bronze; // 铜牌数量降序排序
        }
    }
}

外部类的写法就是创造一个外部的比较器类,去实现这个Comparator<填入要排序的类>接口。

对compare方法进行重写,写出排序的逻辑

在主函数中new出这个比较器类的实例,然后将这个new出的实例填入到sort(比较器类实例)的参数中,用列表调用sort方法进行排序即可

匿名内部类写法

package Test;

import java.util.*;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.print("请输入国家数量:");
        int countryCount = scanner.nextInt();

        List<Country> countries = new ArrayList<>();
        for (int i = 0; i < countryCount; i++) {
            System.out.print("请输入第 " + (i + 1) + " 个国家的奖牌数量(金牌 银牌 铜牌):");
            int gold = scanner.nextInt();
            int silver = scanner.nextInt();
            int bronze = scanner.nextInt();
            countries.add(new Country(gold, silver, bronze));
        }
        //        countries.sort(countries, new Comparator<Country>() {
        //            @Override
        //            public int compare(Country c1, Country c2) {
        //                if (c1.gold != c2.gold) {
        //                    return c2.gold - c1.gold; // 金牌数量降序排序
        //                } else if (c1.silver != c2.silver) {
        //                    return c2.silver - c1.silver; // 银牌数量降序排序
        //                } else {
        //                    return c2.bronze - c1.bronze; // 铜牌数量降序排序
        //                }
        //            }
        //        });
        countries.sort((c1, c2) -> {
            if (c1.gold != c2.gold) {
                return c2.gold - c1.gold; // 金牌数量降序排序
            } else if (c1.silver != c2.silver) {
                return c2.silver - c1.silver; // 银牌数量降序排序
            } else {
                return c2.bronze - c1.bronze; // 铜牌数量降序排序
            }
        });

        for (Country country : countries) {
            System.out.println(country.gold + " " + country.silver + " " + country.bronze);
        }
    }

    static class Country {
        int gold;
        int silver;
        int bronze;

        public Country(int gold, int silver, int bronze) {
            this.gold = gold;
            this.silver = silver;
            this.bronze = bronze;
        }
    }
}

直接让List对象countries调用sort方法——sort(countries, new Comparator<Country>() {}),第一个参数传入要排序的对象,第二个参数new Comparator接口,重写其中的compare方法,实现排序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值