首页 > 编程语言 >【老白学 Java】泛型应用 - 卡拉 OK(四)

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

时间:2024-12-21 21:58:02浏览次数:8  
标签:Java Comparator Song tracks Collections new 泛型 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(三)

标签:Java,Comparator,Song,tracks,Collections,new,泛型,OK,排序
From: https://blog.csdn.net/liujun_sdn/article/details/144618615

相关文章

  • javaFX.(蜜雪冰城点餐小程序)MySQL数据库
    学习Java只有3个月,不喜勿喷该小程序是用的MySQL数据库,编辑软件用的equals,为什么不用idea有提示因为主打一个纯手打要源码私信目录javafx.小程序(蜜雪冰城点餐系统)简介主体思路思路讲解用户登录用户注册忘记密码​编辑主页个人信息修改冬日温暖活动模糊查询,商品......
  • javaweb练习分析——4
    对于单表的查询可能会有多种,其中较为简单的是查询所有、根据id查询、根据其他单一条件查询,但有时会遇到相较于前面的操作较为复杂的操作,就是多条件查询。需要根据前端页面输入的条件来查询。对比简单的查询操作第一个区别是用注解不在适用,要在mapper.xml文件中书写sql语句<sele......
  • javaweb练习分析——5
    在完成对单表的增删改查操作后,就要实现项目中的业务逻辑,比如登录操作、还有目前这个项目中的房产之间的买卖业务逻辑,需要不同角色之间共同完成功能,将多表联系起来。以顾客购买房产为例,第一步首先要将在售的房产呈现出来,之后就是顾客可以点击地址查看详细信息,然后顾客点击交易可以......
  • javaweb练习分析——3
    先实现简单的对各个单表之间的增删改查的操作就以增加数据为例,由于比较简单,就可以直接用注解的方式来实现在mapper文件中,书写sql语句@Insert("insertintohouseinfovalues(#{houseId},#{roomType},#{address},#{year},#{area},#{sales},#{status},#{agent},#{customer})")......
  • JavaSwing 菜单栏
    try{BeautyEyeLNFHelper.frameBorderStyle=BeautyEyeLNFHelper.FrameBorderStyle.osLookAndFeelDecorated;//UIManager.put("RootPane.setupButtonVisible",false);org.jb2011.lnf.beautyeye.BeautyEyeLNFHelpe......
  • Java实现贪吃蛇游戏
    目录一、项目结构二、实现步骤1.创建Snake类2.创建Food类3.创建GameBoard类4.创建SnakeGame类三、总结贪吃蛇是一个经典的电子游戏,它的玩法非常简单,但又充满了挑战。玩家通过控制蛇的移动,吃到食物并不断成长,目标是尽可能长时间生存。本文将介绍如何使用J......
  • 深入理解 JavaScript 中的闭包:让你的代码更简洁高效
    深入理解JavaScript中的闭包:让你的代码更简洁高效JavaScript中的闭包是一个常见且强大的概念,许多JavaScript开发者都在工作中频繁使用闭包。虽然闭包听起来有些抽象,但一旦理解它的工作原理,它将成为你代码中不可或缺的工具。本文将通过简单易懂的解释,结合实际例子,帮助......
  • java微服务中使用redis做缓存技术的应用场景介绍和代码实现
    在Java微服务架构中,Redis作为一种高性能的内存数据结构存储系统,常被用作缓存技术。Redis支持多种数据结构(如字符串、哈希、列表、集合、有序集合等),并且提供了丰富的命令集和高效的读写性能,非常适合用于缓存场景。以下是Redis在Java微服务中的常见应用场景及其代码实现示例。1.......
  • Java学习笔记
    面向过程小知识点基本类型变量和引用类型变量局部变量和成员变量成员变量分为:静态成员变量和实例成员变量staticfinal修饰的成员变量称为常量(宏替换)多态使用父类类型的引用指向子类的对象该引用只能调用父类中定义的方法和变量如果子类中重写了父类中的一个方法,那么在调......
  • javaweb练习分析——2
    在进行完文件的配置之后,就要按照数据库封装bean,放在pojo层中,然后创建相应的mapper.xml文件(创建时要用/间隔)之后根据项目要求,搭建主界面。根据不同角色的功能,搭建各自的界面,以其中一个为例<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname=......