问题描述
计算机系学生会体育部组织了一次“酒井杯”足球联赛,有若干支球队参加,现在联赛已经圆满落幕,各队的积分、净胜球、进球数已经计算出来了,现在要你编写一个程序计算各支球队的排名,然后按照名次从高到低的顺序将各个球队的名字打印出来。
球队的规则如下:
1、先比较积分,积分高者名次在前;
2、如果积分相同则比较净胜球,净胜球多者名次在前;
3、如果积分、净胜球都相同则比较进球数,进球数多者名次在前;
4、对于积分、净胜球和进球数都一样的球队,根据他们的名称按照字典顺序排列。
现在假设各个球队的名称都是由大写英文字母组成,并且没有重名的球队。
球队的规则如下:
1、先比较积分,积分高者名次在前;
2、如果积分相同则比较净胜球,净胜球多者名次在前;
3、如果积分、净胜球都相同则比较进球数,进球数多者名次在前;
4、对于积分、净胜球和进球数都一样的球队,根据他们的名称按照字典顺序排列。
现在假设各个球队的名称都是由大写英文字母组成,并且没有重名的球队。
输入格式
第一行是一个正整数N(2<=N<=10),代表球队的数目
接下来有N行,每一行均包括一个字符串和3个整数,其中字符串代表球队的名称,长度在2与20之间,3个整数依次为球队的积分,净胜球和进球数,其中积分和进球数是0到100间的整数,净胜球的绝对值小于100。
接下来有N行,每一行均包括一个字符串和3个整数,其中字符串代表球队的名称,长度在2与20之间,3个整数依次为球队的积分,净胜球和进球数,其中积分和进球数是0到100间的整数,净胜球的绝对值小于100。
输出格式
共N行,每行输出一个字符串,即球队的名称。
样例输入
4 ACMILAN 5 1 5 SCHALKE 5 1 7 FENERBAHCE 4 -1 7 PSV 7 -1 2
样例输出
PSV
SCHALKE
ACMILAN
FENERBAHCE
题目分析:条件排序
算法分析:第一反应就想用结构体做,还是向java过渡的时间不够啊,面向对象的思想不够深刻。琢磨了很久才解决对象数组和多属性排序的问题,这里在java中主要使用的是Collections.sort和Comparator。详细的思路和代码解释单独写在了Java 对象数组多属性条件排序问题(详解)里,有兴趣研究的可以看看链接。(其实说句实话,这种题目不用C/C++写,硬是要用java写也真的是自虐级别了...)
算法设计:
import java.util.*;
public class Main {
static class Info {
private String name;
private int x;
private int y;
private int z;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getx() {
return x;
}
public void setx(int x) {
this.x = x;
}
public int gety() {
return y;
}
public void sety(int y) {
this.y = y;
}
public int getz() {
return z;
}
public void setz(int z) {
this.z = z;
}
}
@SuppressWarnings("unchecked")
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
String temp = sc.nextLine();
Info[] a = new Info[N+1];
List<Info> b = new ArrayList();
for (int i = 0; i < N; i++) {
String str = sc.nextLine();
String[] s = str.split(" ");
a[i] = new Info();
a[i].setName(s[0]);
a[i].setx(Integer.parseInt(s[1]));
a[i].sety(Integer.parseInt(s[2]));
a[i].setz(Integer.parseInt(s[3]));
b.add(a[i]);
}
Collections.sort(b, new Comparator<Info>() {
public int compare(Info team1, Info team2) {
int x = team1.getx() - team2.getx();
int y = team1.gety() - team2.gety();
int z = team1.getz() - team2.getz();
if (x != 0) {
return x > 0 ? -1:1;
}
if (y != 0) {
return y > 0 ? -1:1;
}
if(z!=0) {
return z > 0 ? -1:1;
}
return team1.name.compareTo(team2.name);
}
});
for (Info result : b) {
System.out.println(result.getName());
}
}
}