Java多级比较器

2023-12-11

我正在解决一个问题,我必须从输入文件中获取这些“歌曲艺术家对”并按字母顺序排序。排序指南如下:

  • 应首先按作者姓名对歌曲-艺术家对进行排序。
  • 按艺术家排序后,如果同一艺术家有多首歌曲,也应按字母顺序排序。
  • 如果艺术家姓名以“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是我正在解析的文本文件的样子,其中第一行是测试用例的数量,后面跟着一个数字,其中包含歌曲艺术家对的数量。


假设您所说的成功创建的类名为SongArtistPair它有一个方法叫做effectiveAuthor()它返回作者姓名,不带The,和一个方法getSongName()它返回歌曲的名称。您可以使用 Java 8 提供的这种模式Comparator API.

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

之后,只需使用它comp像平常一样

查看 Comparator API 文档以获取更多精彩内容HERE

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java多级比较器 的相关文章

  • 来自数据库的 jfreechart 散点图

    如何使用java中的jfreechart绘制mysql数据库表中数据的散点图 我使用过 Swing 库 任何链接都会有帮助 我搜索了谷歌但找不到理解的解决方案 如果您有代码 请提供给我 实际上我确实做了条形图并使用 jfreechart 绘
  • Firestore - RecycleView - 图像持有者

    我不知道如何编写图像的支架 我已经设置了 2 个文本 但我不知道图像的支架应该是什么样子 你能帮我告诉我图像的文字应该是什么样子才能正确显示吗 holder artistImage setImageResource model getArt
  • 如何从 Retrofit2 获取字符串响应?

    我正在做 android 正在寻找一种方法来执行超级基本的 http GET POST 请求 我不断收到错误 java lang IllegalArgumentException Unable to create converter for
  • 从零开始的 numpy 形状意味着什么

    好的 我发现数组的形状中可以包含 0 对于将 0 作为唯一维度的情况 这对我来说是有意义的 它是一个空数组 np zeros 0 但如果你有这样的情况 np zeros 0 100 让我很困惑 为什么这么定义呢 据我所知 这只是表达空数组的
  • 将表值参数与 SQL Server JDBC 结合使用

    任何人都可以提供一些有关如何将表值参数 TVP 与 SQL Server JDBC 一起使用的指导吗 我使用的是微软提供的6 0版本的SQL Server驱动程序 我已经查看了官方文档 https msdn microsoft com en
  • Node.js - console.log 不显示数组中的项目,而是显示 [Object]

    我在注销对象内数组的内容时遇到问题 实际的物体看起来像这样 var stuff accepted item1 item2 rejected response Foo envelope from The sender to new item1
  • 隐式超级构造函数 Person() 未定义。必须显式调用另一个构造函数?

    我正在开发一个项目 但收到错误 隐式超级构造函数 Person 未定义 必须显式调用另一个构造函数 我不太明白它 这是我的人物课程 public class Person public Person String name double D
  • 计算日期之间的天数差异

    在我的代码中 日期之间的差异是错误的 因为它应该是 38 天而不是 8 天 我该如何修复 package random04diferencadata import java text ParseException import java t
  • 在 angular2 中过滤数组

    我正在研究如何在 Angular2 中过滤数据数组 我研究过使用自定义管道 但我觉得这不是我想要的 因为它似乎更适合简单的表示转换 而不是过滤大量数据 数组排列如下 getLogs Array
  • 将 2D NumPy 数组按元素相乘并求和

    我想知道是否有一种更快的方法 专用 NumPy 函数来执行 2D NumPy 数组的元素乘法 然后对所有元素求和 我目前使用np sum np multiply A B 其中 A B 是相同维度的 NumPy 数组m x n 您可以使用np
  • Spring Security OAuth2简单配置

    我有一个简单的项目 需要以下简单的配置 我有一个 密码 grant type 这意味着我可以提交用户名 密码 用户在登录表单中输入 并在成功时获得 access token 有了该 access token 我就可以请求 API 并获取用户
  • 如何配置 WebService 返回 ArrayList 而不是 Array?

    我有一个在 jax ws 上实现的 java Web 服务 此 Web 服务返回用户的通用列表 它运行得很好 Stateless name AdminToolSessionEJB RemoteBinding jndiBinding Admi
  • 尝试使用等于“是”或“否”的字符串变量重新启动 do-while 循环

    计算行程距离的非常简单的程序 一周前刚刚开始 我有这个循环用于解决真或假问题 但我希望它适用于简单的 是 或 否 我为此分配的字符串是答案 public class Main public static void main String a
  • 为什么java中的for-each循环中需要声明变量

    for 每个循环的通常形式是这样的 for Foo bar bars bar doThings 但如果我想保留 bar 直到循环结束 我可以not使用 foreach 循环 Foo bar null Syntax error on toke
  • Linux 上有关 getBounds() 和 setBounds() 的 bug_id=4806603 的解决方法?

    在 Linux 平台上 Frame getBounds 和 Frame setBounds 的工作方式不一致 这在 2003 年就已经有报道了 请参见此处 http bugs java com bugdatabase view bug do
  • 如何在 Quartz 调度程序中每 25 秒运行一次?

    我正在使用 Java 的 Quartz Scheduling API 你能帮我使用 cron 表达式每 25 秒运行一次吗 这只是一个延迟 它不必总是从第 0 秒开始 例如 序列如下 0 00 0 25 0 50 1 15 1 40 2 0
  • Java:拆箱整数时出现空指针异常?

    此代码导致空指针异常 我不知道为什么 private void setSiblings PhylogenyTree node Color color throws InvalidCellNumberException PhylogenyTr
  • Java的-XX:+UseMembar参数是什么

    我在各种地方 论坛等 看到这个参数 并且常见的答案是它有助于高并发服务器 尽管如此 我还是找不到 sun 的官方文档来解释它的作用 另外 它是Java 6中添加的还是Java 5中存在的 顺便说一句 许多热点虚拟机参数的好地方是这一页 ht
  • Android - 9 补丁

    我正在尝试使用 9 块图片创建一个新的微调器背景 我尝试了很多方法来获得完美的图像 但都失败了 s Here is my 9 patch 当我用Draw 9 patch模拟时 内容看起来不错 但是带有箭头的部分没有显示 或者当它显示时 这部
  • JAXB - 列表<可序列化>?

    我使用 xjc 制作了一些课程 public class MyType XmlElementRefs XmlElementRef name MyInnerType type JAXBElement class required false

随机推荐

  • 如何在 MATLAB 中填充两条直线和一条不直的曲线之间的区域(该区域不是多边形)

    使用 matlab 的 FILL 函数创建一个由直边多边形限定的填充区域 不幸的是 这在上图中留下了一个小的白色区域 因为我想要填充的区域的边界不是直边多边形 而是在左侧有一个弯曲的边界 我有一条曲线 几乎是抛物线 但不完全是 我想填充两条
  • 使用 MATLAB 分离图像中两个重叠的圆

    如何使用 MATLAB 将下图中两个相连的圆分开 我尝试过使用imerode 但这并没有给出好的结果 腐蚀不起作用 因为为了腐蚀得足以将圆圈分开 线条会消失或被破坏 在其他起始图片中 圆和线重叠 因此隔离重叠的对象也不起作用 该图像显示了通
  • SBT 在 Build.scala 中指定 java 堆大小

    我的 Build scala 文件内容 val commonSettings Seq version 1 0 0 organization com collective scalaVersion 2 11 4 scalacOptions L
  • ActionBarSherlock 和 ActionBar 兼容性之间的差异

    有什么区别动作栏夏洛克 and 操作栏兼容性 几天前 谷歌刚刚发布了 ActionBar 兼容性 这让我很困惑 Action Bar Compatibility 的工作原理与 ActionBarSherlock 相同并且编码相同吗 示例 是
  • Spring MVC 错误“NoSuchMethodError”

    我收到以下错误 请给我一些建议 我在用spring sts SEVERE StandardWrapper Throwable java lang NoSuchMethodError org springframework web conte
  • 解构中的 ES6 计算属性 - 解构整个对象

    我有这个变量 var a b 1 c 2 d rawr rawr 10 我想将它们解构到本地范围内 所以我这样做 var b c d a 这工作正常 但我需要得到rawr出去 我试过这个 var b c d a d a 但这给了我missi
  • Excel VBA:如何使用给定代码循环浏览同一文件夹中的工作簿?

    上一篇文章 我需要创建一个宏 循环遍历单个文件夹中的文件并运行我在下面提供的代码 所有文件的结构都相同 但是数据不同 该代码帮助我转到指定的目标文件并计算列中 YES 的数量 然后它将其输出到 CountResults xlsm 主工作簿
  • 相对于另一个向量对一个向量进行排序 - 最有效的方法?

    我知道这个问题已经 被问到 a few times 但对于简单的情况 其中紧凑性 可读性或用户熟练程度是决定因素 提供了不同的答案 我不确定哪一个是最有效率的 因为我担心重复该操作O 1M 次 设置如下 两个向量A and B of flo
  • 当多个活动处于活动状态时如何关闭应用程序

    我开了3个活动 现在用户想要退出应用程序 为此我必须完成所有活动 不建议这样做 但我的应用程序希望向用户提供这样的退出点 当多个活动处于活动状态时如何关闭应用程序 Thanks Android 中任何应用程序的所有活动都使用相同的进程 ID
  • 在 Angularfire 中什么时候使用 $asArray 和 $asObject ?

    看来有很多情况可以选择是否使用 asArray or asObject 在同样的情况下 你可以使用其中任何一个来逃脱 我是一位代码 js 初学者 但是什么时候应该使用 asArray 和 asObject 最新版本的角火1 0 0使用新的
  • 如何使用 Bison 实现“隐式乘法”规则?

    我正在为数学表达式解析器编写 Bison 文件 到目前为止 一切都很好 但我面临着隐式乘法的问题 你看 我想支持这样的表达2x sin 4x cos 4x 它应该像这样解析2 x sin 4 x cos 4 x 这里没什么太糟糕的 但请考虑
  • 数组什么时候在c中充当指针?

    我知道数组名称可以用作指针 尽管它是转换后的形式 但我的问题是 是否还有其他实例将数组用作指针 从技术上讲 数组名永远不会充当指针 一个 具有数组类型 可以是数组名称 的表达式将转换 每当数组类型不合法但指针类型合法时 都指向指针 并且数组
  • 将 FrameLayout 转换为位图

    我有一个 FrameLayout 其中包含一些图像视图和一个 EditText 我将此布局保存为内存中的图像 外部 第一次 当我在 imageviews 中设置图像时 一切都很顺利 即正在保存确切的图像 与屏幕上显示的相同 但是第一次保存后
  • Matplotlib 滚动条

    我有一个线泛化算法 并且想在图中添加一个滚动条 以增加容差 即使线变得越来越泛化 使用 matplotlib 这怎么可能 总而言之 我希望能够单击并拖动滑块 以显示线上公差效果的增加 仍然在努力解决这个问题 我只想要一个从 1 到 10 的
  • 如何将“IsDirty”属性添加到 LINQ to SQL 实体?

    我将我的实体绑定到 WPF 中的编辑表单 在 DataTemplate 中 我希望能够设置 DataTemplate 中根容器的背景颜色 以显示它已更改并且这些更改尚未提交到数据库 这是一个非常简单的示例 演示了我正在谈论的内容 请原谅错误
  • 使用 css 强制抗锯齿:这是一个神话吗?

    最近 一位客户抱怨 IE6 中系统字体的外观 基本上这个问题是 IE6 不支持字体平滑 抗锯齿 我知道你可以在操作系统设置或其他设置中打开它 但有人扔掉了这个宝石 您可以使用 pt 而不是 px 来强制 css 中的字体反锯齿 我在各种浏览
  • 使用 JHipster 将新字段添加到现有实体

    当我尝试向现有实体添加新字段时遇到问题 我运行这个命令 yo jhipster entity Libro 和我选择 BETA 是的 添加更多字段和关系 但是当我尝试使用 mvnw 编译我的项目时 我收到此错误http pastebin co
  • 托管 C++ 中 future 和 Promise 的替代方案是什么

    当使用 clr 标志编译托管 C 代码时 编译器不允许包含 我正在尝试将非托管 C 代码移植到托管 C 环境中 我看到 C 有替代方案 Task 和 TaskCompletionSource 来替代 futures 和 Promise 但我
  • 如何使用BottomNavigationBar显示活动(无法转换为片段)?

    我在显示我的活动时遇到问题 我不知道如何实现方法注意活动 to 主页片段 主页片段是由底部导航栏不执行注意活动 注意活动 public class NoteActivity extends AppCompatActivity private
  • Java多级比较器

    我正在解决一个问题 我必须从输入文件中获取这些 歌曲艺术家对 并按字母顺序排序 排序指南如下 应首先按作者姓名对歌曲 艺术家对进行排序 按艺术家排序后 如果同一艺术家有多首歌曲 也应按字母顺序排序 如果艺术家姓名以 The 开头 则出于排序