PAT甲级1036【Boys vs Girls】 java排序

附上题目链接~https://www.patest.cn/contests/pat-a-practise/1036

题意就是输出女生中成绩最高的那个女生的name和id,男生中成绩最低的那个男生的name和id,和两个成绩的差值f.grade-g.grade

其实就是一个C++中的结构体排序题,那么在Java中我用class代替结构体,排序的时候有两种方法。

1)第一种方法是在类person内实现Comparable接口并且实现其compareTo方法。这样我们调用Arrays.sort()时只要输入数组,起始位置,终止位置就可以啦。

2)第二种则是重写cmp接口,定义一个Comparator<person>类型的cmp,后实现必要的compare方法。后调用Arrays.sort()时输入数组,起始位置,终止位置,cmp就行啦。

方法1代码:

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

class person implements Comparable<person>{
	String name;
	String id;
	int grade;
	public person(String name, String id, int grade) {
		this.name = name;
		this.id = id;
		this.grade = grade;
	}
	@Override
	public int compareTo(person o) {
		return this.grade-o.grade;
	}
	
}
public class A1036 {

	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int n = in.nextInt();
		person[] g = new person[n];//女生person类数组
		person[] b = new person[n];//男生person类数组
		String name, id,sex;
		int grade;
		int cnt1=0, cnt2=0;
		for(int i = 0; i<n; i++){
			name = in.next();
			sex = in.next();
			id = in.next();
			grade = in.nextInt();
			//实际上sex并不用存,因为已经分为了男女两个数组
			if(sex.equals("M")) b[cnt1++] = new person(name, id, grade);
			else g[cnt2++] = new person(name, id, grade);
		}
		if(cnt2>0){
			Arrays.sort(g, 0, cnt2);//按grade从小大排序,数组最后一个即为成绩最高的女生
			System.out.println(g[cnt2-1].name+" "+g[cnt2-1].id);
		}
		else System.out.println("Absent");
		if(cnt1>0){
			Arrays.sort(b, 0, cnt1);//按grade从小到大排序,数组第一个即为成绩最低的男生
			System.out.println(b[0].name+" "+b[0].id);
		}
		else System.out.println("Absent");
		if(cnt1==0 || cnt2==0) //至少有一个为0则不能相减,输出NA
			System.out.println("NA");
		else System.out.println(Math.abs(g[cnt2-1].grade-b[0].grade));
	}

}

方法2代码:

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

class person {
	String name;
	String id;
	int grade;
	public person(String name, String id, int grade) {
		this.name = name;
		this.id = id;
		this.grade = grade;
	}
	
}
public class A1036 {

	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int n = in.nextInt();
		person[] g = new person[n];
		person[] b = new person[n];
		String name, id,sex;
		int grade;
		int cnt1=0, cnt2=0;
		//重写cmp接口
		Comparator<person> cmp = new Comparator<person>() {
			public int compare(person o1, person o2) {
				return o1.grade-o2.grade;
			}
		};
		for(int i = 0; i<n; i++){
			name = in.next();
			sex = in.next();
			id = in.next();
			grade = in.nextInt();
			if(sex.equals("M")) b[cnt1++] = new person(name, id, grade);
			else g[cnt2++] = new person(name, id, grade);
		}
		if(cnt2>0){
			Arrays.sort(g, 0, cnt2, cmp);//这里还要加上cmp
			System.out.println(g[cnt2-1].name+" "+g[cnt2-1].id);
		}
		else System.out.println("Absent");
		if(cnt1>0){
			Arrays.sort(b, 0, cnt1, cmp);//这里还要加上cmp
			System.out.println(b[0].name+" "+b[0].id);
		}
		else System.out.println("Absent");
		if(cnt1==0 || cnt2==0)
			System.out.println("NA");
		else System.out.println(Math.abs(g[cnt2-1].grade-b[0].grade));
	}

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值