我正在解决一个问题,我必须从一个输入文件中取出这些“歌曲-艺术家对”并按字母顺序排序。排序的指导方针是这样的:
我的问题是,当我对这些进行排序时,我能够正确地对艺术家进行排序,但在他们有相同艺术家的情况下,我无法对歌曲进行排序。
这是输入文件的样子:
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());
}
}
(我已经创建了一个类来轻松跟踪歌曲和它们的艺术家。有效作者()方法返回作者的字符串,名称前面没有“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
我最初的想法是循环数组,找到同一位艺术家的歌曲,然后找到一种方法对它们进行排序,然后将它们重新插入数组,这有点复杂。有人告诉我,我可以使用更全面的比较器,让他们对艺术家和歌曲名称进行排序,我只需要调用数组。对所有歌曲对象进行一次排序。
有人能告诉我如何制作一个更全面的比较器来与这种情况有关吗?我目前只知道两种使用比较器的方法,即比较数值(又名如果
谢谢你
PS:如果您想了解我试图解决的问题的更多信息,这是我提到的java程序的贴纸。这就是我正在解析的文本文件的样子,其中第一行是测试用例的数量,后面是歌曲艺术家对的数量。
在您的比较方法中,如果艺术家姓名相同,则比较歌曲名称。像这样:
public static class SongComparator implements Comparator<Song>{
public int compare(Song a, Song b){
int rslt a.effectiveAuthor().compareTo(b.effectiveAuthor());
if (rslt ==0)
{
// compare song names
rslt = a.getSongName().compareTo(b.getSongName());
}
return rslt;
}
}
假设您所说的您成功创建的类名为<code>SongArtistPair的方法,该方法返回作者的名字,而不包含<code>和,还有一个方法<code>getSongName()
Comparator<SongArtistPair> comp = Comparator.comparing(SongArtistPair::effectiveAuthor).thenComparing(SongArtistPair::getSongName);
之后,就像平常一样使用那个comp
在此处查看比较器API文档以获取更多酷的东西
我正在解决一个问题,我必须从一个输入文件中取出这些“歌曲-艺术家对”并按字母顺序排序。排序的指导方针是这样的: 应该先按作者的名字对歌曲艺术家对进行排序。 一旦被艺术家排序,如果同一艺术家有多首歌曲,也应该按字母顺序排序。 如果艺术家的名字以“The”开头,出于排序目的忽略它。 我的问题是,当我对这些进行排序时,我能够正确地对艺术家进行排序,但在他们有相同艺术家的情况下,我无法对歌曲进行排序。 这
假设我实现了一个HashMap,其中字符被分配了一个值的ArrayList。 我已经在HashMap中创建了这些字符的PriorityQueue,但我希望能够根据此优先级删除这些字符: {a,b,c} {a,b}删除c,因为它的ArrayList中包含一个值,该值决定必须首先删除它。 对此最好的方法是什么?
有人能解释一下这里使用的比较运算符的语法吗?它是做什么的
问题内容: 假设我有一对班 我希望先按第一个值排序,然后再按第二个值排序。现在,如果我这样做 一切正常,列表按对的第一个值排序,但是如果我这样做 它因错误而失败 好的,所以它可能无法推断参数,所以如果我这样做 它因错误而失败 为什么它对compare()而不是compare()。thenComparing()有效? 问题答案: 该错误似乎与的通用参数有关。一种解决方法是尝试使用显式类型: 请注意,
问题内容: Comparable和Comparator之间的主要区别是什么。 在什么情况下,哪个比另一个优先? 问题答案: 当你的类实现时,该类的方法将定义该对象的“自然”顺序。根据合同,该方法有义务(尽管不要求)与该对象上的其他方法保持一致,例如,当比较返回true 时,应始终为对象返回0 。 一个比较本身就是如何比较两个对象的定义,可用于可能不与自然顺序排列的方式来比较的对象。 例如,字符串通