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

embedded/2024/12/22 20:06:41/

泛型应用 - 卡拉 OK(四)

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

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

Collections 的另一种排序

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

自定义的 Song 比较器

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

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

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

java">/*** 文件: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(三)

http://www.ppmy.cn/embedded/147901.html

相关文章

macOS brew安装

brew 可以用命令在mac上安装、卸载、更新各种软件包。它是一个用ruby写的软件&#xff0c;软件是托管在github上的。 1、安装brew&#xff0c;一般选择清华源&#xff0c;如果之前安装过brew&#xff0c;执行下面命令时会自动备份old_homebrew&#xff0c;按照操作执行即可&…

workman服务端开发模式-GatewayWorker的使用

一、GatewayWorker介绍 Workerman是一个使用PHP开发的高性能组件&#xff0c;用于构建高性能的异步并发TCP、UDP、Unix Socket、HTTP、Websocket服务。 GatewayWorker是基于Workerman开发的一套TCP长连接的应用框架&#xff0c;实现了单发、群发、广播等接口&#xff0c;内置了…

基于SIFT的目标识别算法

基于SIFT&#xff08;Scale-Invariant Feature Transform&#xff09;的目标识别算法是一种经典的计算机视觉算法&#xff0c;用于在图像中寻找和匹配具有尺度不变性的特征点&#xff0c;从而实现目标的快速而准确的识别。 SIFT算法的主要步骤包括以下几个阶段&#xff1a; 尺…

LLaMA-Factory 单卡3080*2 deepspeed zero3 微调Qwen2.5-7B-Instruct

环境安装 git clone https://gitcode.com/gh_mirrors/ll/LLaMA-Factory.git 下载模型 pip install modelscope modelscope download --model Qwen/Qwen2.5-7B-Instruct --local_dir /root/autodl-tmp/models/Qwen/Qwen2.5-7B-Instruct 微调 llamafactory-cli train \--st…

Day55 | 灵神 | 相向双指针:盛最多水的容器接雨水

Day55 | 灵神 | 相向双指针&#xff1a;盛最多水的容器&&接雨水 盛最多水的容器 接雨水_哔哩哔哩_bilibili 文章目录 Day55 | 灵神 | 相向双指针&#xff1a;盛最多水的容器&&接雨水11.盛最多水的容器42.接雨水优化&#xff1a;双指针做法 11.盛最多水的容器…

SQL进阶技巧:如何求解直接线上最多的点数?

目录 0 问题描述 1 数据准备 2 问题分析 3 求解优化 步骤一:构建 “斜率键” 并统计点的数量(核心步骤) 步骤二:找出最多的点数(最终结果) 0 问题描述 “平面上最多的点数” 问题通常是指在一个二维平面中给定了若干个点的坐标(例如以 (x,y) 的形式表示),要求找…

8K+Red+Raw+ProRes422分享5个影视级视频素材网站

Hello&#xff0c;大家好&#xff0c;我是后期圈&#xff01; 在视频创作中&#xff0c;电影级的视频素材能够为作品增添专业质感&#xff0c;让画面更具冲击力。无论是广告、电影短片&#xff0c;还是品牌宣传&#xff0c;高质量的视频素材都是不可或缺的资源。然而&#xff…

石子移动问题 | 回溯法

问题描述 小S正在玩一个关于石子的游戏&#xff0c;给定了一些石子&#xff0c;它们位于一维数轴的不同位置&#xff0c;位置用数组 stones 表示。如果某个石子处于最小或最大的一个位置&#xff0c;我们称其为端点石子。 在每个回合&#xff0c;小S可以将一颗端点石子移动到…