我正在解决一个问题,我必须从输入文件中获取这些“歌曲艺术家对”并按字母顺序排序。排序指南如下:
- 应首先按作者姓名对歌曲-艺术家对进行排序。
- 按艺术家排序后,如果同一艺术家有多首歌曲,也应按字母顺序排序。
- 如果艺术家姓名以“The”开头,则出于排序目的而忽略它。
我的问题是,当我对这些进行排序时,我能够对艺术家进行正确排序,但随后我无法在歌曲具有相同艺术家的情况下对歌曲进行排序。
输入文件如下所示:
Hello - Adele
Yesterday - The Beatles
Love Me Like You Do - Ellie Goulding
Hey Jude - The Beatles
Istanbul - They Might Be Giants
我已正确阅读输入文件,但到目前为止我的比较器仅按字母顺序对艺术家进行排序。这就是我的比较器的样子:
public static class SongComparator implements Comparator<Song>{
public int compare(Song a, Song b){
return a.effectiveAuthor().compareTo(b.effectiveAuthor());
}
}
(我创建了一个类来轻松跟踪歌曲及其艺术家。 effectiveAuthor() 方法返回作者的字符串,名称前面不带“The”)
当使用 Song 对象数组和比较器调用 Arrays.sort() 时,这是我得到的输出:
Hello - Adele
Yesterday - The Beatles
Hey Jude - The Beatles
Love Me Like You Do - Ellie Goulding
Istanbul - They Might Be Giants
正确排序后的输出如下所示:
Hello - Adele
Hey Jude - The Beatles
Yesterday - The Beatles
Love Me Like You Do - Ellie Goulding
Istanbul - They Might Be Giants
我最初的想法是循环遍历数组并找到同一艺术家的歌曲,然后找到一种方法对它们进行排序并将它们重新插入到该数组中,这有点复杂。有人告诉我,我可以通过让他们对艺术家和歌曲名称进行排序来使用更全面的比较器,并且我只需要为所有 Song 对象调用 Arrays.sort 一次。
有人可以告诉我如何制作一个适合这种情况的更全面的比较器吗?我目前只知道使用比较器的两种方法,即比较数值(也称为如果 a > b 返回 -1,如果 a == b,返回 0,如果 a
谢谢
PS: This是我提到的java程序的pastebin,如果您想更深入地了解我正在尝试解决的问题。This是我正在解析的文本文件的样子,其中第一行是测试用例的数量,后面跟着一个数字,其中包含歌曲艺术家对的数量。