08:病人排队

文章讲述了如何使用Java编程语言实现对病人信息数组的排序,包括按年龄降序和登记号升序,以及在特定条件下调整排序顺序。
摘要由CSDN通过智能技术生成

一、题目链接

http://noi.openjudge.cn/ch0110/08/

二、解题思路

三、实施步骤

四、Java程序

import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;

class Patient implements Comparable<Patient> { // 病人信息类,实现Comparable接口
    int register; // 病人登记号
    String id; // 病人ID
    int age; // 病人年龄

    public Patient(int register, String id, int age) { // 构造方法,用于初始化一个病人对象
        this.register = register;
        this.id = id;
        this.age = age;
    }

    /* 重写Comparable接口的compareTo方法,按age属性降序排序 */
    @Override
    public int compareTo(Patient o) {
        return o.age - this.age;
    }

    /* 重写Object类的toString方法,满足题目要求的输出格式 */
    @Override
    public String toString() {
        return String.valueOf(id);
    }
}

public class Main {
    /**
     * 将给定数组中给定区间内的病人按登记号排成升序
     *
     * @param patients Patient类型的数组,代表给定数组
     * @param from     int类型的整数,代表给定区间的起始边界
     * @param to       int类型的整数,代表给定区间的终止边界
     */
    public void sortByIDASC(Patient[] patients, int from, int to) {
        /* 重写Comparator接口的compareTo方法,按register属性升序排序 */
        Arrays.sort(patients, from, to + 1, new Comparator<Patient>() {
            @Override
            public int compare(Patient o1, Patient o2) {
                return o1.register - o2.register;
            }
        });
    }

    /**
     * 将给定数组中给定区间内的病人按年龄排成降序,年龄相同的按登记号排成升序
     *
     * @param patients Patient类型的数组,代表给定数组
     * @param from     int类型的整数,代表给定区间的起始边界
     * @param to       int类型的整数,代表给定区间的终止边界
     */
    public void sortByAgeDESC(Patient[] patients, int from, int to) {
        /* 重写Comparator接口的compareTo方法,按age主属性降序、register次属性升序排序 */
        Arrays.sort(patients, from, to + 1, new Comparator<Patient>() {
            @Override
            public int compare(Patient o1, Patient o2) {
                if (o1.age == o2.age) { // 如果两条病人记录的age属性相等
                    return o1.register - o2.register; // 按register属性升序排序
                }
                return o2.age - o1.age; // 按age属性降序排序
            }
        });
    }

    /**
     * 将给定数组中的病人按题目要求排序
     *
     * @param patients Patient类型的数组,代表给定数组
     */
    public void sortPatients(Patient[] patients) {
        Arrays.sort(patients); // 将patients数组按age属性降序排序
        int n = patients.length;
        int to = 0;
        /* 找到patients数组中第一个非老年人的位置 */
        while (to < n && patients[to].age >= 60) {
            to++;
        }
        sortByAgeDESC(patients, 0, to - 1); // 将patients数组中的老年人排序
        sortByIDASC(patients, to, n - 1); // 将patients数组中的非老年人排序
    }

    public static void main(String[] args) {
        Main test = new Main();
        Scanner input = new Scanner(System.in);
        int n = input.nextInt();
        Patient[] patients = new Patient[n];
        int register = 1;
        for (int i = 0; i < n; i++) {
            String id = input.next();
            int age = input.nextInt();
            patients[i] = new Patient(register, id, age);
            register++;
        }
        test.sortPatients(patients);
        for (Patient p : patients) {
            System.out.println(p.toString());
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

江苏科技大学_计算机学院_潘磊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值