题目信息
题目:输入任意(用户,成绩)序列,可以获得成绩从高到低或从低到高的排列,相同成绩
都按先录入排列在前的规则处理。
注:0代表从高到低,1代表从低到高
本题含有多组输入数据!
输入描述
输入多行,先输入要排序的人的个数,然后分别输入他们的名字和成绩,以一个空格隔开
输出描述
按照指定方式输出名字和成绩,名字和成绩之间以一个空格隔开
示例输入
3
0
fang 90
yang 50
ning 70
示例输出
fang 90
ning 70
yang 50
题解
这个题的难点是输入有姓名,有成绩,排序的时候,须一起排。
可以定义一个对象,重写该对象的排序方法进行排序;可以使用双数组,对成绩排序时带上姓名。
编码
方法一,使用对象方式排序处理
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Comparator;
public class RankResult {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String input;
while ((input = br.readLine()) != null) {
// 接收数组大小
int arrLength = Integer.parseInt(input);
// 定义对象数组,设置数组大小
Result[] arr = new Result[arrLength];
// 获取升降序标识
String descOrAsc = br.readLine();
// 接收输入的姓名和成绩数据
// 将数据转换为Result对象并存入数组中
int index = 0;
while (index < arrLength) {
String[] arrRow = br.readLine().split(" ");
Result result = new Result(arrRow[0], Integer.parseInt(arrRow[1]));
arr[index] = result;
index++;
}
// 升序排列
if ("1".equals(descOrAsc)) {
Arrays.sort(arr, new Comparator<Result>() {
@Override
public int compare(Result o1, Result o2) {
return o1.getGrade() - o2.getGrade();
}
});
} else {
Arrays.sort(arr, new Comparator<Result>() {
@Override
public int compare(Result o1, Result o2) {
return o2.getGrade() - o1.getGrade();
}
});
}
// 将排好序的内容转换到缓冲字符中,输出
StringBuilder sb = new StringBuilder();
for (Result result : arr) {
sb.append(result.getName()).append(" ").append(result.getGrade()).append("\n");
}
System.out.println(sb.substring(0, sb.length()-1));
}
}
}
/**
* @定义成绩类
* @包含姓名和成绩两个字段
*/
class Result {
private String name;
private int grade;
public Result(String name, int grade) {
this.name = name;
this.grade = grade;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getGrade() {
return grade;
}
public void setGrade(int grade) {
this.grade = grade;
}
}
方法二,使用双数组方式排序处理
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class RankResult {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String input;
while ((input = br.readLine()) != null) {
int arrLength = Integer.parseInt(input);
// 根据数组长度定义成绩数组和姓名数组
int[] result = new int[arrLength];
String[] name = new String[arrLength];
// 获取升降序标识
String descOrAsc = br.readLine();
// 接收姓名和成绩数据信息,存入对应数组中
for (int i=0; i<arrLength; i++) {
String[] arrRow = br.readLine().trim().split(" ");
result[i] = Integer.parseInt(arrRow[1]);
name[i] = arrRow[0];
}
// 升序排列
if ("1".equals(descOrAsc)) {
// 冒泡排序,两个数组同时排序
for (int i=0; i<arrLength-1; i++) {
for (int j=0; j<arrLength-1-i; j++) {
if (result[j] > result[j+1]) {
int tmpResult = result[j];
result[j] = result[j+1];
result[j+1] = tmpResult;
String tmpName = name[j];
name[j] = name[j+1];
name[j+1] = tmpName;
}
}
}
} else {
// 降序排列
for (int i=0; i<arrLength-1; i++) {
for (int j=0; j<arrLength-1-i; j++) {
if (result[j] < result[j+1]) {
int tmpResult = result[j];
result[j] = result[j+1];
result[j+1] = tmpResult;
String tmpName = name[j];
name[j] = name[j+1];
name[j+1] = tmpName;
}
}
}
}
// 数组内容转换输出
StringBuilder sb = new StringBuilder();
for (int i=0; i<arrLength; i++) {
sb.append(name[i]).append(" ").append(result[i]).append("\n");
}
System.out.println(sb.substring(0, sb.length()-1));
}
}
}