当前位置: 首页 > news >正文

【老白学 Java】泛型应用 - 卡拉 OK(四)

泛型应用 - 卡拉 OK(四)

码老白
文章来源:《Head First Java》修炼感悟。

上文说到,解决了按歌名排序的问题后,老白立刻想到了按歌手名字排序的问题。 老白决定趁热打铁,尝试着实现自定义排序方式。

Collections 的另一种排序

老白查看了 Collections 另一个排序方法的定义,对参与比较的对象没有强制实现 Comparable 接口的要求,意味着任何类都可以进行比较:
Collections排序方法2sort() 方法说明中指出,需要使用指定的比较器,即 Comparator 接口提供的 compare() 方法。 我们再来看看 比较器接口是如何定义的:
Comparator比较器接口
Comparator 接口说明中指出,能够为没有自然顺序的对象集合提供排序操作。 如此就可以实现各种各样的比较器,而不会像 compareTo() 方法只能将自己和另一个同类型对象进行比较。

自定义的 Song 比较器

了解了带比较器接口的排序方法后,老白现在需要做三件事情:

  1. 创建 Comparator 内部类,实现 compare() 方法用于比较;
  2. 创建 Comparator 比较器对象;
  3. 调用 Collections 带比较器接口的重载方法。

再次修改代码,版本编号 v5.0:

/*** 文件:Karaoke5.java* * 描述:模拟 KTV 曲目清单,学习使用集合排序。* 版本:v5.0*/
import java.io.*;
import java.util.*;public class Karaoke5 {/*** 用于对歌手名字进行比较的内部类,实现了Comparator接口*/class ArtistCompare implements Comparator<Song> {// 对传入的Song对象的歌手名字的字符串进行比较// 并返回一个整数值给 Collections 的比较方法public int compare(Song one, Song two) {return one.getArtist().compareTo(two.getArtist());}}// 用来保存所有曲目的列表ArrayList<Song> tracks = new ArrayList<Song>();// 执行入口public void go() {loadSongs();// 原始顺序System.out.println("original: " + tracks);// 按曲目排序Collections.sort(tracks);System.out.println("by title: " + tracks);// 按歌手名字排序ArtistCompare ac = new ArtistCompare();Collections.sort(tracks, ac);System.out.println("by artist: " + tracks);}// 载入曲目文件private void loadSongs() {try {// 先不理会下面语句的含义,// 只需知道能读取 songs.txt 文件内容就可以了File file = new File("songs.txt");BufferedReader reader = new BufferedReader(new FileReader(file));String line = null;while ((line = reader.readLine()) != null) {addSong(line);}} catch (Exception e) {e.printStackTrace();}}// 解析曲目private void  addSong(String token) {String[] tokens = token.split("/");Song s = new Song(tokens[0], tokens[1], tokens[2], tokens[3]);tracks.add(s);}// 程序入口public static void main(String[] args) {new Karaoke5().go();}
}

编译执行:
按歌手名字排序很不错,现在按歌名、按歌手都可以排序了。

新的问题接踵而至...

随着 KTV 营业时间越来越久,曲目中偶尔会出现重复歌曲或者歌手。 那么这种重复数据又该如何处理呢? 老白又闲不住了…


《 上一篇 泛型应用 - 卡拉 OK(三)下一篇 HashSet 应用 - 卡拉 OK(五) 》

相关文章:

【老白学 Java】泛型应用 - 卡拉 OK(四)

泛型应用 - 卡拉 OK&#xff08;四&#xff09; 文章来源&#xff1a;《Head First Java》修炼感悟。 上文说到&#xff0c;解决了按歌名排序的问题后&#xff0c;老白立刻想到了按歌手名字排序的问题。 老白决定趁热打铁&#xff0c;尝试着实现自定义排序方式。 Collections…...

android studio更改应用图片,和应用名字。

更改应用图标&#xff0c;和名字 先打开AndroidManifest.xml文件。 更改图片文件名字&#xff08; 右键-->构建-->重命名&#xff08;R&#xff09;&#xff09;...

SQL Server 表值函数使用示例

在 SQL Server 中,表值函数(Table-Valued Functions, TVFs)是一种用户定义函数,它可以返回一个表。表值函数有两种类型:内联表值函数(Inline Table-Valued Function)和多语句表值函数(Multi-Statement Table-Valued Function)。下面分别介绍这两种类型的表值函数及其使…...

SpringBoot项目的创建方式

目录 1.通过idea创建SpringBoot项目 2.在idea中通过aliyun创建SpringBoot 3.通过spring官网下载再用idea打开 5.通过mavenjava项目改为springboot项目 6.测试springboot 第二种方法使用的是idea2021版本&#xff0c;其余方法使用idea2017版本 1.通过idea创建SpringBoot项…...

微服务设计(第2版)读书笔记

微服务概述 什么是微服务&#xff1f; 答&#xff1a;微服务&#xff08;microservice&#xff09;是基于业务领域建模的&#xff0c;可独立发布的服务。它会把业务内聚的功能封装起来&#xff0c;并通过网络供其他服务访问。将这样的服务组合起来构建出更复杂的系统。 微服务…...

idea无法识别文件,如何把floder文件恢复成model

前景&#xff1a; 昨天&#xff0c;我在之前的A1214模块包下新增了一个demo类&#xff0c;然后又新建了一个A1216模块&#xff0c;写了算法题&#xff0c;后面打算用git提交&#xff0c;发现之前的A1214模块下的demo类和新建的模块源文件都已经被追踪了&#xff0c;都是绿色的&…...

vscode的keil assistant 中搜索不到全局变量

搜不到 但是在包含的文件中输入 ../../../,就是全局搜索的结果 我的文件结构是&#xff1a;\Desktop\LVGL文件系统移植&#xff08;lvgl8&#xff0e;&#xff13;&#xff09;\Projects\MDK-ARM 盲猜是keil assistant 当前文件夹打开的时候是进入到了MDK-ARM文件夹层次&…...

html+css网页设计 美食 餐饮杰12个页面

htmlcss网页设计 美食 餐饮杰12个页面 网页作品代码简单&#xff0c;可使用任意HTML辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff09;。 获取源码 1&#xff…...

重撸设计模式--代理模式

文章目录 定义UML图代理模式主要有以下几种常见类型&#xff1a;代理模式涉及的主要角色有&#xff1a;C 代码示例 定义 代理模式&#xff08;Proxy Pattern&#xff09;属于结构型设计模式&#xff0c;它为其他对象提供一种代理以控制对这个对象的访问。 通过引入代理对象&am…...

Redis性能调优:深入剖析变慢原因及应对策略

如果观察到&#xff0c;这个实例的运行延迟是正常 Redis 基准性能的 2 倍以上&#xff0c;即可认为这个 Redis 实例确实变慢了。 1.如何查看实例的运行延迟 &#xff08;1&#xff09;redis-cli -h 127.0.0.1 -p 6379 --intrinsic-latency 60 执行该命令&#xff0c;就可以测…...

Python联合Halcon的详细教程

以下是一份Python联合Halcon的详细教程&#xff1a; 一、简介 Halcon是一款由德国MVTec公司开发的高级机器视觉软件&#xff0c;提供了一套强大的图像处理库&#xff0c;包括特征检测、识别、测量等功能。Python联合Halcon是一种将Python编程语言与计算机视觉库Halcon集成的应…...

raid 状态查看 storcli64

场景 当磁盘报错的时候使用该命令排查 fdisk -l /dev/sdb fdisk: cannot open /dev/sdb: Input/output error进一步使用 smartctl 排查 smartctl -a /dev/sdb 输出 smartctl 7.1 2019-12-30 r5022 [x86_64-linux-5.4.0-144-generic] (local build) Copyright (C) 2002-19, B…...

时间管理系统|Java|SSM|JSP|

【技术栈】 1⃣️&#xff1a;架构: B/S、MVC 2⃣️&#xff1a;系统环境&#xff1a;Windowsh/Mac 3⃣️&#xff1a;开发环境&#xff1a;IDEA、JDK1.8、Maven、Mysql5.7 4⃣️&#xff1a;技术栈&#xff1a;Java、Mysql、SSM、Mybatis-Plus、JSP、jquery,html 5⃣️数据库可…...

使用Docker启用MySQL8.0.11

目录 一、Docker减小镜像大小的方式 1、基础镜像选择 2、减少镜像层数 3、清理无用文件和缓存 4、优化文件复制&#xff08;COPY和ADD指令&#xff09; 二、Docker镜像多阶段构建 1、什么是dockers镜像多阶段构建 1.1 概念介绍 1.2 构建过程和优势 2、怎样在Dockerfil…...

Qt之修改窗口标题、图标以及自定义标题栏(九)

Qt开发 系列文章 - titles-icons-titlebars&#xff08;九&#xff09; 目录 前言 一、修改标题 二、添加图标 三、更换标题栏 1.效果演示 2.创建标题栏类 3.定义相关函数 4.使用标题栏类 总结 前言 在我们利用Qt设计软件时&#xff0c;经常需要修改窗口标题、更改软…...

每天40分玩转Django:Django测试

Django测试 一、今日学习内容概述 学习模块重要程度主要内容测试基础⭐⭐⭐⭐⭐TestCase、断言方法模型测试⭐⭐⭐⭐⭐模型方法、数据验证视图测试⭐⭐⭐⭐请求处理、响应验证表单测试⭐⭐⭐⭐表单验证、数据处理覆盖率测试⭐⭐⭐⭐coverage配置、报告生成 二、测试基础示例…...

JS子页面调用父页面函数,监听刷新事件

目录 1.子页面调用父页面的函数 2.监听刷新事件 1.子页面调用父页面的方法 我们先来说说什么是子页面&#xff0c;在我这里子页面就是域名一样&#xff0c;然后使用iframe引入的页面就是我所说的子页面&#xff0c;为什么需要用到这个功能&#xff0c;是为了实现跨页面交互与…...

Element@2.15.14-tree checkStrictly 状态实现父项联动子项,实现节点自定义编辑、新增、删除功能

背景&#xff1a;现在有一个新需求&#xff0c;需要借助树结构来实现词库的分类管理&#xff0c;树的节点是不同的分类&#xff0c;不同的分类可以有自己的词库&#xff0c;所以父子节点是互不影响的&#xff1b;同样为了选择的方便性&#xff0c;提出了新需求&#xff0c;选择…...

详细介绍如何使用rapidjson读取json文件

本文主要详细介绍如何使用rapidjson库来实现.json文件的读取&#xff0c;分为相关基础介绍、结合简单示例进行基础介绍、结合复杂示例进行详细的函数实现介绍等三部分。 一、相关基础 1、Json文件中的{} 和 [] 在 JSON 文件中&#xff0c;{} 和 [] 分别表示不同的数据结构&…...

【Qt】显示类控件:QLabel、QLCDNumber、QProgressBar、QCalendarWidget

目录 QLabel QFrame 例子&#xff1a; textFormat pixmap、scaledContents alignment wordWrap、indent、margin buddy QLCDNumber 例子&#xff1a; QTimer QProgressBar 例子&#xff1a; QCalendarWidget 例子&#xff1a; QLabel 标签控件&#xff0c;用来显示…...

NLP-StructBERT在跨语言语义匹配中的惊艳效果案例

NLP-StructBERT在跨语言语义匹配中的惊艳效果案例 最近在做一个国际化产品的语义搜索功能时&#xff0c;遇到了一个挺头疼的问题&#xff1a;用户用中文提问&#xff0c;但我们的知识库里有大量优质的英文资料。传统的做法是先把问题翻译成英文&#xff0c;再去搜索&#xff0…...

Claude Code每日更新速览(v2.1.90)-2026/04/02

本文前言&#xff1a; Claude Code 的进化速度&#xff0c;已经到了一种让人来不及消化的程度。根据 github.com/anthropics/claude-code/blob/main/CHANGELOG.md 获取最新的变更&#xff0c;跟紧 Claude Code新功能、新趋势。最新版本&#xff1a;v2.1.90提交时间&#xff1a;…...

AI辅助开发:用自然语言描述需求,让快马平台自动生成精准的Copaw自动化脚本

AI辅助开发&#xff1a;用自然语言描述需求&#xff0c;让快马平台自动生成精准的Copaw自动化脚本 最近在做一个自动化测试项目&#xff0c;需要大量使用Copaw框架来模拟用户操作。作为一个刚接触Copaw的新手&#xff0c;最头疼的就是要花大量时间研究各种API和页面元素定位方…...

智能制造企业数字化转型智慧工厂建设方案:涵盖研发、供应、生产、销售、服务五大核心环节的智慧工厂建设路径

该方案围绕研发、供应、生产、销售、服务全价值链&#xff0c;融合AI、大数据、5G等技术&#xff0c;通过智能优化、智慧供应链、智能质检、数字孪生及精准营销等模块&#xff0c;构建全链路智慧工厂&#xff0c;实现降本增效与制造企业全面数字化转型。 该方案以“研发—供应…...

5大突破让暗黑2单机体验翻倍:PlugY插件全方位应用指南

5大突破让暗黑2单机体验翻倍&#xff1a;PlugY插件全方位应用指南 【免费下载链接】PlugY PlugY, The Survival Kit - Plug-in for Diablo II Lord of Destruction 项目地址: https://gitcode.com/gh_mirrors/pl/PlugY 当你第10次因储物箱满被迫丢弃装备时&#xff0c;当…...

深度学习特征分解、SVD 与 PCA —— 矩阵的“质因数分解“(六)

1. 定位导航 本篇是第2章线性代数的终篇,覆盖三个最有力的矩阵分析工具:特征分解、奇异值分解(SVD)、主成分分析(PCA)。此外还包括三个辅助工具:Moore-Penrose 伪逆、迹运算、行列式。 这些工具贯穿深度学习的方方面面——PCA 用于数据预处理和降维,SVD 用于模型压缩…...

2026企业AI落地必看:避开3大坑,让你的智能体真正帮你赚钱!收藏这份实战指南

本文深入探讨了企业AI智能体落地的现实难题&#xff0c;包括数据基础薄弱、单体智能体处理复杂流程能力不足以及人机协同缺失三大痛点。作者通过分析30企业案例&#xff0c;提出了针对性的解决方案&#xff1a;建立RAG架构和OCR数据清洗以夯实数据基础&#xff1b;采用多智能体…...

剪映高级感文字动画素材合集 预设+教程全整理

平时做口播视频时&#xff0c;总觉得文字动画的精致度跟不上内容节奏&#xff0c;找适配的素材又要花不少时间&#xff0c;所以最近整理了一份剪映高级感口播动态文字动画素材合集&#xff0c;涵盖预设、教程和配套排查资料&#xff0c;今天分享给有同样需求的朋友。 一、素材合…...

OpenClaw故障模拟:Qwen3-14b_int4_awq异常输入处理与恢复机制

OpenClaw故障模拟&#xff1a;Qwen3-14b_int4_awq异常输入处理与恢复机制 1. 为什么需要主动制造故障 去年冬天的一个深夜&#xff0c;我的OpenClaw自动化流程突然中断了。当时它正在帮我整理一批技术文档&#xff0c;却在处理某个特殊字符时直接"卡死"。这次经历让…...

告别迷茫!Quartus II 13.1 从新建工程到烧录FPGA的保姆级避坑指南

Quartus II 13.1实战指南&#xff1a;从零开始玩转FPGA开发 第一次打开Quartus II 13.1时&#xff0c;那个灰蒙蒙的界面和密密麻麻的菜单栏确实容易让人望而生畏。作为Altera&#xff08;现已被Intel收购&#xff09;旗下经典的FPGA开发工具&#xff0c;它在高校实验室和企业研…...