我正在解决一个问题,我必须从输入文件中获取这些“歌曲艺术家对”,并按字母顺序进行排序。排序准则如下:
我的问题是,当我对这些歌曲进行排序时,我可以对它们进行正确排序,但是在他们具有相同艺术家的条件下,我无法对歌曲进行排序。
这是输入文件的样子:
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 <b,则返回1)和String值(又名a.compareTo(b)),但我不知道如何制作一个更精细的比较器,以帮助我先按歌手然后按歌曲名称排序。
谢谢
PS:这是我提到的Java程序的pastebin,如果您想进一步了解我要解决的问题。这就是我正在解析的文本文件的样子,第一行是测试用例的数量,其后是带有歌曲艺术家对的数量。
假设您说过要创建的类被调用,SongArtistPair并且它具有名为的方法effectiveAuthor(),该方法返回作者的姓名而没有The,还有一个方法getSongName(),其返回歌曲的名称。您可以使用Java 8 ComparatorAPI 提供的这种模式。
SongArtistPair
effectiveAuthor()
The
getSongName()
Comparator
Comparator<SongArtistPair> comp = Comparator.comparing(SongArtistPair::effectiveAuthor).thenComparing(SongArtistPair::getSongName);
之后,只需comp正常使用
comp
检查比较API文档更多很酷的东西HERE