首页 > 编程语言 >【老白学 Java】集合应用 - 卡拉 OK(一)

【老白学 Java】集合应用 - 卡拉 OK(一)

时间:2024-12-18 20:29:17浏览次数:10  
标签:Java ArrayList tracks new OK 曲目 排序 void 老白学

集合应用 - 卡拉 OK(一)

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

最近老白准备研究一下 Java 集合和泛型的相关知识。 为了增加学习乐趣,老白通过一些小案例来了解集合类的基本用法。 本篇文章打算编写一个简单的曲目处理程序,其中使用到了类库中的排序方法。

一、显示点唱曲目

程序中包含读取和解析文件的代码,先大致了解,以后还会有相关介绍。 首先需要准备曲目文件 songs.txt,假设内容如下:

Communication/The Cardigans
Black Dog/Led Zeppelin
Dreams/Van Halen
Comfortably Numb/Pink Floyd
Beth/Kiss
忘情水/刘德华

可以看到,每一行都是一首歌曲名称+歌手名称,中间用斜杠 / 分割,这样做是为了方便解析文件并把内容字符串保存在 ArrayList 列表中。 下面老白尝试写出第一版基础代码:

/**
 * 文件:KaraokePlayer.java
 * 
 * 描述:模拟卡拉OK点唱的曲目清单,学习使用集合排序。
 * 版本:v1.0
 */
import java.io.*;
import java.util.*;

public class KaraokePlayer {

	// 用来保存所有曲目的列表
	ArrayList<String> tracks = new ArrayList<String>();
	
	// 程序执行入口
	public void go() {
		loadSongs();
		System.out.println(tracks);
	}
	
	// 用来加载、读取 songs.txt 文件
	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("/");
		tracks.add(tokens[0]);
	}
	
	// 程序入口
	public static void main(String[] args) {
		new KaraokePlayer().go();
	}
}

编译运行结果:
曲目清单(没有排序)
发现问题了吗? 输出的曲目并没有按名称排序。 通常,KTV 是通过歌名或歌手点歌,显然目前的这个输出效果并不是太好。 下面我们通过另一种方式来改善这个情况。

二、为点唱曲目排序

要想把曲目按名称排序,先从 ArrayList 入手,翻看 API 中有没有适合的方法。遗憾的是,ArrayList 以及它的继承结构都没有提供类似排序的方法,显然不适合排序操作。

ArrayList 在集合类中很常用,但有几个类同样也很重要:

  • TreeSet 有序排列元素,并且没有重复;
  • HashMap 可以通过 key/value 键值对存取元素;
  • LinkedList 适合经常插入/删除元素操作,类似 ArrayList;
  • HashSet 没有重复元素,适合查找;
  • LinkedHashMap 类似 HashMap,可记录元素插入时的顺序;
  • ...

通过翻看 API 老白发现,TreeSet 和 Collections 都有 sort() 方法,并且还发现 Collections.sort() 的参数类型是 List,而 ArrayList 也是 List 类型。 看来把保存曲目清单的 ArrayList 当做参数传入 sort() 方法是可行的。 下面我们来尝试一下:

/**
 * 文件:Juckbox.java
 * 
 * 描述:模拟 KTV 点唱的曲目清单,学习使用集合排序。
 * 版本:v2.0
 */
import java.io.*;
import java.util.*;

public class Juckbox {

	// 用来保存所有曲目的列表
	ArrayList<String> tracks = new ArrayList<String>();

	public void go() {
		loadSongs();
		System.out.println(tracks);
	
		// 静态方法,可以对传入的 List 元素进行排序
		Collections.sort(tracks);
		System.out.println(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("/");
		tracks.add(tokens[0]);
	}

	public static void main(String[] args) {
		new Juckbox().go();
	}
}

编译执行结果:
曲目清单(排序)从输出结果来看,两次输出已经有了明显区别。 第一次是没有排序的清单,第二次是按照名称首字母排序的曲目清单。

v2.0 和 v1.0 的差别就在 go() 方法中多了一条排序语句:

Collections.sort(tracks);

正因为使用了 Collections 的静态方法 sort(),才能毫不费力地完成排序任务。

三、老板的新花样

正当老白沉浸在喜悦中时,老板找上门:「你的排序过于单调,把所有歌名的字符串都换做 Song 对象,那样就能显示更多信息…」


《 上一篇 请注意,你有一个异常未处理

标签:Java,ArrayList,tracks,new,OK,曲目,排序,void,老白学
From: https://blog.csdn.net/liujun_sdn/article/details/144544333

相关文章

  • python连接okx查询自己的持仓【量化交易】
     需要安装ccxt以下代码在jupyter中运行需要去app中获取自己的apiKey、secret、password,才能查到自己的个人持仓情况根据自己的代理设置proxiesimportccxtimportpandasaspdimporttimefromIPython.displayimportclear_outputimporttracebackfromdatetimeimp......
  • Java框架 —— SpringMVC
    MVC分层MVC:ModelViewController(模型-视图-控制器)模型(Model):处理数据逻辑的部分;在web应用中,他通常包含与数据库交互的代码,负责数据的存储、检索和更新视图(View):将数据渲染为用户界面,视图只展示页面,不包含业务逻辑控制器(Controller):模型和视图之间的协调者,它接收用户的......
  • java中的FileReader和FileWriter类
    一、介绍使用FileOutputStream类向文件中写入数据与使用FileInputStream类从文件中将内容读出来,都存在一点不足,即这两个类都只提供了对字节或字节数组的读取方法。由于汉字在文件中占用两个字节,如果使用字节流,读取不好可能会出现乱码现象,此时采用字节流Reader或Writer类即可避......
  • Java核心技术卷1 第四章选读
    前言本文内容选自Java核心技术卷1第10版,感兴趣的小伙伴可以自行阅读原书,以下内容为本人学习后摘取的片段与大家分享。正文4.10类设计技巧我们不会面面俱到,也不希望过于沉闷,所以这一章结束之前,简单地介绍几点技巧。应用这些技巧可以使得设计出来的类更具有OOP的专业水准。......
  • Java基于springboot+vue的摄影设备租赁管理系统
    收藏关注不迷路!!......
  • VOLTE网络中SIP消息的registration-token参数
    在VOLTE网络中,通信业务标识(Feature-CapabilityIndicator,或者字面翻译成“特性能力指示符”)是经常出现在SIPHeader中的一个参数,其取值和说明可参见3GPPTS24.237。这里简要介绍其中之一的g.3gpp.registration-token(在SIPHeader的Contact域出现时也被称作mediafeaturetag[媒......
  • JavaWeb核心技术阶段的详细学习路线
    一、HTML/CSS/JS基础(1-2周)HTML(超文本标记语言)学习HTML文档结构,包括DOCTYPE声明、html标签、head标签和body标签的作用。掌握常见的HTML标签,如标题标签(h1-h6)、段落标签(p)、链接标签(a)、图像标签(img)、列表标签(ul、ol、li)等。学习表格标签(table、tr、td)用于数据展示,表单标签......
  • Java大厂提升技能阶段学习路线的详细规划
    一、微服务架构开发思想与实现Docker学习Docker的基本概念,包括镜像、容器、仓库等。掌握Docker的安装与配置,在本地环境和服务器环境中进行部署。学会使用Dockerfile构建自定义镜像,以及使用docker-compose编排多容器应用。了解Docker网络模型,实现容器间的通信与......
  • 膜拜!阿里自爆十万字Java面试手抄本,脉脉一周狂转50w/次
    2025年的金三银四很快就到了,铁子们做好跳槽拿高薪的准备了吗?为了帮助大家能够找到一份满意的工作,我找到了在阿里任职的同学,他把内网上十万字Java面试手抄本直接开源分享了出来;十万字Java面试手抄本这份Java面试手抄本包含了——Java基础、并发编程、JVM、Dubbo、MyBatis、Ka......
  • JavaSE基础学习路线
    Java入门、IntellijIDEA、AI辅助工具Java入门:主要涵盖Java语言的基本概念,比如它是一种面向对象的编程语言,跨平台性强(通过Java虚拟机实现“一次编写,到处运行”的特性),了解如何安装Java开发环境(JDK)等基础内容,是踏入Java编程世界的第一步。IntellijIDEA:一款功能强大且非常流行的J......