每日一练:利用多态思想和ArrayList集合,编写一个模拟KTV点歌系统的程序。【多态思想和ArrayList集合的综合应用】

目录

  • 一、设计程序
        • 使用ArrayList集合,编写一个模拟KTV点歌系统的程序。
        • 参考代码
          • 歌曲类
          • 歌单类
          • KTV类
          • 测试类
          • 运行效果
        • 总结
    • 最后

一、设计程序

使用ArrayList集合,编写一个模拟KTV点歌系统的程序。
  • 要求:
    • 输入0代表添加歌曲
    • 输入1代表将所选歌曲置顶
    • 输入2代表将所选歌曲提前一位
    • 输入3代表删除所选音乐
    • 输入4代表退出该系统
  • 效果展示
    在这里插入图片描述

  • 思路:
    • 歌曲类:歌曲名字
    • 歌单类:包含歌曲类,用ArrayList容器装起来
      • 增加歌曲
      • 删除歌曲
      • 移动歌曲
      • 查找歌曲
    • KTV类:包含歌单类
      • 输入歌曲
      • 输入操作数
      • 操作系统

参考代码
歌曲类
package day604.homework;import java.util.Objects;public class Song {private String name;// 歌曲名字public Song(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}//重写equals 以便于集合ArrayList中contains方法判断歌单中是否包含输入的歌曲//因为contains底层是通过遍历ArrayList,再调用元素的equal的方法判等@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Song song = (Song) o;return Objects.equals(name, song.name);}@Overridepublic int hashCode() {return Objects.hash(name);}@Overridepublic String toString() {return "Song{" +"name='" + name + '\'' +'}';}
}
歌单类
package day604.homework;import java.util.ArrayList;public class SongSheet {private final int SONG_SIZE = 4; // 默认歌单容量private  final ArrayList<Song> DEFAULTAUL_SONG_LIST = new ArrayList<>(SONG_SIZE);// 默认歌单private ArrayList<Song> songList;// 实际操作的歌单,我自己模仿ArrayList源码写的,哈哈public SongSheet() {DEFAULTAUL_SONG_LIST.add(new Song("写不完的温柔"));DEFAULTAUL_SONG_LIST.add(new Song("泡沫"));DEFAULTAUL_SONG_LIST.add(new Song("雨后人去楼也空"));DEFAULTAUL_SONG_LIST.add(new Song("绿色"));songList = DEFAULTAUL_SONG_LIST; //无参构造,将实际操作的歌单引用默认歌单}public SongSheet(ArrayList<Song> songArrayList) {this.songList = songArrayList;}public ArrayList<Song> getSongArrayList() {return songList;}public void setSongArrayList(ArrayList<Song> songArrayList) {this.songList = songArrayList;}// 检查歌曲是否正确,或歌单是否包含,以便于去重public boolean songCheek(Song song){if (song == null || songList.contains(song)) {return false;}return true;}// 添加歌曲public int addSong(Song song){if (!songCheek(song)){ //判断是否包含添加歌曲,包含直接返回,不用再次添加System.out.println("输入歌曲有误或歌曲重复");return -1;}songList.add(song);return 1;}//删除歌曲public int removeSong(Song song){if(songCheek(song)){ //判断是否包含删除歌曲,不包含直接返回return -1;}songList.remove(song);return 1;}public int songTopping(Song song){if(songCheek(song)){//判断是否包含置顶歌曲,不包含直接返回return -1;}removeSong(song);songList.add(0,song);return 1;}public int songMove_forward_one(Song song){int songIndex = songList.indexOf(song);if (songIndex <= 0 || songCheek(song)) {//判断是否包含移动歌曲或歌曲是否在首位,不包含直接返回,在首位,不能在移动,直接返回return -1;}removeSong(song);songList.add(songIndex-1,song);return 1;}@Overridepublic String toString() {return "SongSheet{" +"songList=" + songList +'}';}
}
KTV类
package day604.homework;import java.util.Scanner;public class KTV {private SongSheet songSheet;// 歌单public KTV() {songSheet = new SongSheet();}public KTV(SongSheet songSheet) {this.songSheet = songSheet;}public SongSheet getSongSheet() {return songSheet;}public void setSongSheet(SongSheet songSheet) {this.songSheet = songSheet;}//打开系统public  void openKTV(){System.out.println("---------欢迎来到点歌系统----------");System.out.println("0.添加歌曲至列表");System.out.println("1.将歌曲置顶");System.out.println("2.将歌曲前移一位");System.out.println("3.删除歌曲");System.out.println("4.退出");System.out.println("初始化歌单列表:"+songSheet.toString());int i = 0;while(i >= 0 && i < 4){// 控制系统运行System.out.println("请输入操作数:");i = getInputOperand(); // 获得操作数if (i >=0 && i < 4) {System.out.println("请输入歌曲名字:");controlSongSheet(i,getInputSong());//调用控制歌单方法}System.out.println("当前歌单列表:"+songSheet.toString());// 打印}System.out.println("退出成功");}//控制歌单方法public void controlSongSheet(int key,Song song){switch(key){case 0:songSheet.addSong(song);break;case 1:songSheet.songTopping(song);break;case 2:songSheet.songMove_forward_one(song);break;case 3:songSheet.removeSong(song);break;default:System.out.println("输入错误");}}//获得操作数public int getInputOperand(){Scanner scanner = new Scanner(System.in);return scanner.nextInt();}// 获得歌曲public Song getInputSong(){Scanner scanner = new Scanner(System.in);String songName = scanner.nextLine();return new Song(songName);}}
测试类
package day604.homework;public class Test {public static void main(String[] args) {KTV ktv = new KTV();ktv.openKTV();// 打开系统}
}
运行效果

在这里插入图片描述


总结
  • 使用到的ArrayList的方法:
    - boolean add(E e) —>将指定的元素添加到此列表的尾部。
    • void add(int index, E element) —>将指定的元素插入此列表中的指定位置。
    • int remove(E e)—>将指定的元素移除。
    • int indexOf(E e)—>返回指定元素下标。
    • int size()—>返回列表元素数量’
    • boolean contains(E e)—>判断是否包含该元素。
  • 注意:使用contains,记得要重写元素的equals方法,因为contains底层是通过遍历集合,一个一个的通过equals方法判断是否相等。
    在这里插入图片描述

最后

如果感觉有收获的话,点个赞 👍🏻 吧。
❤️❤️❤️本人菜鸟修行期,如有错误,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/22514.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

云原生环境下GPU算力调度发展分析

云原生环境下GPU算力调度深度分析 概述&#xff1a; 云原生时代&#xff0c;GPU算力调度与管理备受瞩目&#xff0c;成为企业和云服务提供商关注的焦点&#xff0c;助力AI、深度学习、高性能计算等领域&#xff0c;满足对GPU资源的迫切需求。 容器化与编排&#xff1a; Kube…

突破开源天花板!最强文本转语音工具ChatTTS:对话式高可控的语音合成模型

ChatTTS 一夜爆火&#xff0c; 极速出圈&#xff0c; 3 天就斩获 9k 的 Star 量&#xff0c; 截止 2024.06.04&#xff0c; 已经 19.3k 的 star&#xff0c; 极速接近 GPT-soVITs 当天的 26.2k 的 star 数。 什么是ChatTTS&#xff1f; TTS全称&#xff1a;Text To Speech&am…

java 基于注解的防重复提交

由于前端未作防抖校验或者接口调用者出现问题导致调用多次情况时有发生&#xff0c;像查询这种请求即使多次请求也不会造成什么影响&#xff0c;但是涉及增删改可就影响大了。 1、首先定义一个自定义注解 /*** 自定义注解防止表单重复提交* * author fjh**/ Inherited Target…

数字生命计划1.0

一. 背景 即使人们强调思维与肉体是两大构成个体的先决条件&#xff0c;但科学界始终没有放弃探索摆脱肉体的介质&#xff0c;从而让思维上载的研究。 这就是数字生命计划的初衷。所谓数字生命&#xff0c;就是将人类的意识思维抽离&#xff0c;上传至云端或智能终端&#xf…

eMMC的封装类型及特点有哪些?

eMMC&#xff08;Embedded MultiMediaCard&#xff09;是一种高度集成的嵌入式存储解决方案&#xff0c;广泛应用于智能手机、平板电脑、笔记本电脑、消费电子产品和物联网设备等领域。eMMC的封装形式对其性能、应用和设备设计有着重要的影响。目前&#xff0c;eMMC主要有两种封…

航空航天技术翻译要求

航空航天技术是一项国际化产业&#xff0c;航空技术更新迅速涉及的专业知识较为广泛。在航空领域&#xff0c;每一个术语都有着特定的含义和用法&#xff0c;稍有差池就可能导致翻译出现严重的后果&#xff0c;因此&#xff0c;航空航天翻译扮演者至关重要的角色。 专业航空航天…

【ARM Cache 与 MMU 系列文章 7.6 -- ARMv8 MMU 相关寄存器介绍】

文章目录 MMU 转换控制寄存器 TCR_ELxTCR_ELx 概览TCR_ELx 寄存器字段详解TCR 使用示例Normal MemoryCacheableShareability MMU 内存属性寄存器 MAIR_ELx寄存器结构内存属性字段使用实例 MMU 地址翻译表基址寄存器 TTBR0/1_ELxTTBR0_ELx 寄存器概述寄存器结构功能和用途编程示…

在Spark SQL中,fillna函数

目录 前言 以下是在Spark SQL中使用fillna函数的示例代码&#xff1a; 运行以上代码将输出&#xff1a; 总结 前言 在Spark SQL中&#xff0c;fillna函数用于填充DataFrame或Dataset中的缺失值&#xff08;NULL或NaN&#xff09;。它可以根据指定的列名和值来替换缺失值&…

idea Pycharm Webstorm 2024年 最新版 永久使用2099年教程 附激活码亲测可用

idea Pycharm Webstorm 2024年 最新版 永久使用2099年教程 附激活码亲测可用 链接&#xff1a; 下载 IntelliJ IDEA – 领先的 Java 和 Kotlin IDE (jetbrains.com)&#xff08;这是官网的&#xff09; 下载 安装 1.双击idea的安装包&#xff0c;点击next 选择创建桌面快捷…

深入剖析时序Prophet模型:工作原理与源码解析|得物技术

随着得物业务的快速发展&#xff0c;积累了大量的时序数据&#xff0c;这些数据对精细化运营&#xff0c;提升效率、降低成本有着重要作用。在得物的时序数据挖掘场景中&#xff0c;时序预测Prophet模型使用频繁&#xff0c;本文对Prophet的原理和源码进行深入分析&#xff0c;…

linux学习:进程通信 管道

目录 例子1 父进程向子进程发送一条消息&#xff0c;子进程读取这条消息 例子2 mkfifo 函数创建一个命名管道 例子3 mkfifo 函数创建一个命名管道处理可能出现的错误 例子4 管道文件是否已存在 例子5 除了“文件已存在”进行处理 例子6 创建一个命名管道&…

删除docker 镜像和容器

删除docker镜像&#xff0c;需要先删除容器&#xff1b; 删除docker容器&#xff0c;需要先停止容器&#xff1b; ①查询容器 docker ps -a 查看相关容器&#xff08;运行中和停止的&#xff09; ②停止容器 docker stop 容器id ③删除容器docker rm 容器id ④docker rmi…

边缘计算网关:企业数字化转型的重要支撑-天拓四方

在数字化浪潮席卷全球的今天&#xff0c;企业对于数据处理和传输的需求日益增强。然而&#xff0c;传统的数据处理模式往往依赖于中心化的数据中心&#xff0c;这种方式在处理大量数据时存在延迟高、成本高、安全性差等问题。数据量的激增和实时性要求的提高&#xff0c;使得传…

让AI给你写代码(9.3):一点改进,支持扩展本地知识库

改进目标&#xff0c;当输入提示问题后&#xff0c;能匹配到本地知识库的需求&#xff0c;然后AI按匹配到的需求给出代码并进行自动测试&#xff1b; 如果无法匹配到本地需求&#xff0c;可以直接输入生成逻辑&#xff0c;再由AI生成&#xff0c;然后支持用户把新需求插入本地库…

XML概述、格式、解析-WEB

XML概述 XML&#xff08;Extensible Markup Language&#xff09; 可扩展的标识语言 数据传输的一种格式 树形结构&#xff08;节点&#xff09; 优点 解析的更快 : 使用标签语言&#xff0c;能够很快定位 占用空间小 : 纯文本格式 可读性强 : 带有名字的标签我们都很喜欢 跨平…

MathType7.9最新免费注册机注册码激活码分享

MathType作为一个强大的数学公式编辑器&#xff0c;广泛用于教育、科研和出版领域。它支持多种文档格式和数学符号&#xff0c;是撰写科技文档不可或缺的工具。对于一些个人用户和小型机构来说&#xff0c;正版软件的高昂价格可能是一个负担。因此&#xff0c;寻找合法途径下的…

Windows 10 以上版本用久了应该重新安装还是重置呢?

今天明月工作电脑的 Windows 10 因为安装过太多软件和使用太久了的缘故造成网络总是很不稳定&#xff0c;总是出现一些莫名其妙的问题&#xff0c;实在是懒得去查找和排错了&#xff0c;就想着干脆推到重来吧&#xff0c;这样性能表现还会提升不少&#xff0c;并且可以一次性的…

向量化:机器学习中的效率加速器与数据桥梁

在机器学习领域的广袤天地中&#xff0c;向量化技术以其独特的魅力&#xff0c;为数据处理和模型训练注入了强大的动力。本文将深入探讨向量化在机器学习领域中的体现&#xff0c;剖析其如何助力模型实现高效的数据处理和精确的结果预测&#xff0c;并通过丰富的案例和详尽的数…

容器中运行ping提示bash: ping: command not found【笔记】

容器中运行ping提示bash: ping: command not found 原因是容器中没有安装ping命令 在容器中安装ping命令&#xff0c;可以使用以下命令&#xff1a; 对于基于Debian/Ubuntu的容器&#xff0c;使用以下命令&#xff1a; apt-get update apt-get install -y iputils-ping对于基…

【如何利用c++RAII技术实现自动加解锁】

1. 思路 可以使用C中的 RAII&#xff08;资源获取即初始化&#xff09;技术来实现自动加锁解锁。这意味着你可以创建一个包含加锁和解锁操作的类&#xff0c;并在其构造函数中加锁&#xff0c;在析构函数中解锁。这样&#xff0c;在该类的实例化对象超出作用域时&#xff0c;自…