Java二级排序,Java多级比较器

I am working on a problem where I must take these "Song-artist pairs" from an input file and sort alphabetically. The guidelines to the sorting goes like so:

Should sort the song-artist pairs by the name of the author first.

Once sorted by the artists, if there are multiple songs by the same artist, they should be sort alphabetically as well.

If the artists name starts with "The", ignore it for sorting purposes.

My problem is that when I am sorting these, I am able to get the artists sorted properly, but then I cannot sort the songs under the conditions that they have the same artist.

This is what the input file would look like:

Hello - Adele

Yesterday - The Beatles

Love Me Like You Do - Ellie Goulding

Hey Jude - The Beatles

Istanbul - They Might Be Giants

I have properly read through the input file, but so far my comparator only sorts the artists alphabetically. This is what my comparator looks like:

public static class SongComparator implements Comparator{

public int compare(Song a, Song b){

return a.effectiveAuthor().compareTo(b.effectiveAuthor());

}

}

(I have created a class to easily keep track of the songs and their artists. The effectiveAuthor() method returns the string of the author without the "The " in front of the name)

When calling Arrays.sort() with the array of Song objects and comparator, this is the output I get:

Hello - Adele

Yesterday - The Beatles

Hey Jude - The Beatles

Love Me Like You Do - Ellie Goulding

Istanbul - They Might Be Giants

This is what the output with the proper sorting would look like:

Hello - Adele

Hey Jude - The Beatles

Yesterday - The Beatles

Love Me Like You Do - Ellie Goulding

Istanbul - They Might Be Giants

My original idea was to loop through the array and find the songs with the same artist, and find a way to sort them and re-insert those back into that array, which is a bit complex. I was told that I could use a more comprehensive comparator by having them sort both the artist and song names, and that I would only need to call Arrays.sort once for all of the Song objects.

Can somebody show me how to make a more comprehensive comparator that would pertain to this situation? I currently only know two ways that I can use a comparator, which is to compare numerical values(aka if a > b return -1, if a == b, return 0, and if a < b, return 1), and String values(aka a.compareTo(b)), but I do not know how I would be able to make a more elaborate comparator to help me out with being able to sort by artist first and then the song name.

Thank you

PS: This is a pastebin to the java program I mentioned, if you would like more insight on the problem I am trying to solve. This is what the text file would look like that I am parsing through, where the first line is the number of test cases, followed by a number with the amount of song-artist pairs.

解决方案

Let's say the class you said you managed to create is called SongArtistPair and it has a method called effectiveAuthor()which returns the author's name without the The, and a method getSongName() which returns the name of the song. You can use this pattern offered by the Java 8 Comparator API.

Comparator comp = Comparator.comparing(SongArtistPair::effectiveAuthor).thenComparing(SongArtistPair::getSongName);

After that, just use that comp as normal

Check Comparator API docs for more cool stuff HERE

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值