整理音乐
Time Limit: 1000 ms Memory Limit: 65536 KiB
Problem Description
请用链表完成下面题目要求。
xiaobai 很喜欢音乐,几年来一直在收集好听的专辑。他有个习惯,每次在听完一首音乐后会给这首音乐打分,而且会隔一段时间给打好分的音乐排一个名次。今天 xiaobai 打开自己的音乐文件夹,发现有很多不同时期打过分的排好序的子音乐文件夹,他想把这些音乐放到一块,组成一个分数有序的序列。由于音乐文件很多,而文件里音乐的数目也是不确定的,怎么帮帮 xiaobai 完成这件工作呢?
Input
输入数据第一行为一个整数n(n<1000),代表文件夹的数量。接下来是n个文件夹的信息,每个文件夹信息的第一行是一个数字m(m<=10000),代表这个文件夹里有m首歌,后面m行每行一个歌曲名、分数,之间用空格分开。歌曲名称不超过5个字符。
Output
输出一行,为所有音乐组成的一个序列,音乐只输出名字。
如果音乐分数相同则按照音乐名字典序进行排序。
Sample Input
3
4
aaa 60
aab 50
aac 40
aad 30
2
kkk 60
kkd 59
3
qow 70
qwe 60
qqw 20
Sample Output
qow aaa kkk qwe kkd aab aac aad qqw
Hint
Source
链表题,Java直接用list就可以了,跟c++的STL有异曲同工之处。
学到的内容:
使用 list 类
List l = new ArrayList(); 和 List l = new List(); 的区别
https://www.cnblogs.com/zcscnn/p/7743507.html
进一步熟悉 对象 和 类
关于字符串的输入
in.nest() 以空格和回车为分割符 不可以读空格
in.nestLine() 以回车为分割符 可以读空格
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main {
public static void main(String args[]) {
Scanner in = new Scanner(System.in);
List<Music> l = new ArrayList<>();
int n = in.nextInt();
for (int i = 0; i < n; i++) {
int m = in.nextInt();
for (int j = 0; j < m; j++) {
Music t = new Music(in.next(), in.nextInt());
insert(l, t);
}
}
int size = l.size();
for (int i = 0; i < size; i++) {
if (i == size - 1)
System.out.println(l.get(i).name);
else
System.out.print(l.get(i).name + " ");
}
in.close();
}
public static void insert(List<Music> l, Music t) {
int i, len = l.size();
for (i = 0; i < len; i++) {
if (t.score > l.get(i).score) {
l.add(i, t);
break;
} else if (t.score == l.get(i).score) {
String name = l.get(i).name;
if (t.name.compareTo(name) <= 0) {
l.add(i, t);
break;
}
}
}
if (i == len)
l.add(t);
}
}
class Music { // 类似c/c++的结构体
String name;
int score;
public Music(String name, int score) {
this.name = name;
this.score = score;
}
}