每日一练:利用多态思想和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.rhkb.cn/news/340651.html

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

相关文章

STM32高级控制定时器之输入捕获模式

目录 概述 1 输入捕获模式 1.1 原理介绍 1.2 实现步骤 1.3 发生输入捕获流程 2 使用STM32Cube配置工程 2.1 软件环境 2.2 配置参数 2.3 生成项目文件 3 功能实现 3.1 PWM调制占空比函数 3.2 应用函数库 4 测试 4.1 功能框图 4.2 运行结果 源代码下载地址&#xf…

MySQL 存储过程(一)

本篇主要介绍MySQL存储过程的相关内容 目录 一、什么是存储过程&#xff1f; 二、基本语法 创建存储过程 调用存储过程 查看存储过程 删除存储过程 三、变量 系统变量 用户自定义变量 局部变量 四、存储过程的参数 in out inout 一、什么是存储过程&#xff1f…

9 个步骤内快速完成 SEO 审核

SEO审计对于提高网站在搜索引擎结果中的性能和可见性至关重要。这种系统评估涉及仔细检查各种元素&#xff0c;从关键字和页面优化到网站结构和页面速度等技术方面。在本指南中&#xff0c;我们将概述执行全面 SEO 检查器的 12 个基本步骤&#xff0c;帮助您确定优势、劣势和改…

基于小波区间相关的信号降噪方法(MATLAB 2021B)

在我们处理信号过程中最重要的任务就是找到信号隐藏的规律和信号的特征。常用的傅里叶分析法只能用于在时间域或者频率域上分析信号&#xff0c;而通常的数据会在时间域和频率域均有特征。而小波分析是继傅里叶分析之后的一大突破性创新&#xff0c;也是近年来在学术界非常热门…

小熊家务帮day5-day7 客户管理模块1 (小程序认证,手机验证码认证,账号密码认证,修改密码,找回密码等)

客户管理模块 1.认证模块1.1 认证方式介绍1.1.1 小程序认证1.1.2 手机验证码登录1.1.3 账号密码认证 1.2 小程序认证1.2.1 小程序申请1.2.2 创建客户后端工程jzo2o-customer1.2.3 开发部署前端1.2.4 小程序认证流程1.2.4.1 customer小程序认证接口设计Controller层Service层调用…

使用import语句导入模块

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 创建模块后&#xff0c;就可以在其他程序中使用该模块了。要使用模块需要先以模块的形式加载模块中的代码&#xff0c;这可以使用import语句实现。im…

react、vue动态form表单

需求在日常开发中反复写form 是一种低效的开发效率&#xff0c;布局而且还不同这就需要我们对其封装 为了简单明了看懂代码&#xff0c;我这里没有组件&#xff0c;都放在一起&#xff0c;简单抽离相信作为大佬的你&#xff0c;可以自己完成&#xff0c; 一、首先我们做动态f…

外包小菜鸡花了几个w报的课立志进大厂

不知不觉已经毕业了好几年&#xff0c;但是感觉还是自己的年龄增长了而已&#xff0c;对应的技术却没学到&#xff0c;最后一咬牙报了图灵的架构VIP班&#xff0c;不得不说&#xff0c;诸葛老师讲的是真的好呀&#xff0c;大家可以看看他的公开课&#xff0c;希望学完下面这些视…

JVMの内存泄漏内存溢出案例分析

1、内存溢出 内存溢出指的是程序在申请内存时&#xff0c;没有足够的内存可供分配&#xff0c;导致无法满足程序的内存需求&#xff0c;常见的内存溢出情况包括堆内存溢出&#xff08;Heap Overflow&#xff09;和栈溢出&#xff08;Stack Overflow&#xff09;&#xff1a; …

《数字图像处理-OpenCV/Python》第15章:图像分割

《数字图像处理-OpenCV/Python》第15章&#xff1a;图像分割 本书京东 优惠购书链接 https://item.jd.com/14098452.html 本书CSDN 独家连载专栏 https://blog.csdn.net/youcans/category_12418787.html 第15章&#xff1a;图像分割 图像分割是由图像处理到图像分析的关键步骤…

spark的简单学习二

一 spark sql基础 1.1 Dataframe 1.介绍&#xff1a; DataFrame也是一个分布式数据容器。然而DataFrame更像传统数据库的二维表 格&#xff0c;除了数据以外&#xff0c;还掌握数据的结构信息&#xff0c;即schema。同时&#xff0c;与Hive类似&#xff0c;DataFrame也支 持…

STM32_HAL_I2C_串行接口

电气特性 I2C&#xff08;Inter-Integrated Circuit&#xff09;是一种由飞利浦公司&#xff08;现恩智浦半导体&#xff09;开发的串行通信协议&#xff0c;用于连接低速外围设备。I2C总线只需要两根线&#xff08;SDA&#xff1a;串行数据线&#xff0c;SCL&#xff1a;串行…

免费生物蛋白质的类chatgpt工具助手copilot:小分子、蛋白的折叠、对接等

参考: https://310.ai/copilot 可以通过自然语言对话形式实现小分子、蛋白质的相关处理:生成序列、折叠等 应该是agent技术调用不同工具实现 从UniProt数据库中搜索和加载蛋白质。使用ESM Fold方法折叠蛋白质。使用310.ai基础模型设计新蛋白质。使用TM-Align方法比较蛋白质…

【Spring Cloud】微服务链路跟踪Sleuth

目录 为什么要使用微服务链路跟踪微服务的现状多服务协同工作复杂的调用链条容易出错 微服务链路跟踪需要实现的需求实现监控决策避免技术债务快速定位故障 微服务链路跟踪的技术要求低消耗应用透明延展性可控采样率可视化 Spring Cloud Sleuth简介Spring Cloud Sleuth的4个特点…

Shell脚本快速入门

为什么要学shell&#xff1f;能做什么&#xff1f; 答&#xff1a;CI/CD 持续集成&#xff0c;自动化部署作业方式&#xff0c;需要将一系列linux命令程序化&#xff0c;shell 就能做到&#xff0c;提高运维人员的工作效率。 指定解析器&#xff1a; (1) shell解析器 #…

Linux网络-自定义协议、序列化和反序列化、网络计算服务器的实现和Windows端客户端

文章目录 前言一、自定义协议传结构体对象 序列化和反序列化什么是序列化&#xff1f;反序列化 二、计算器服务端&#xff08;线程池版本&#xff09;1.main.cc2.Socket.hpp3.protocol.hpp4.Calculator.hpp5.serverCal.hpp6.threadPool.hpp7.Task.hpp8. log.hpp 客户端Windows客…

小白级教程—安装Ubuntu 20.04 LTS服务器

下载 本教程将使用20.04版进行教学 由于官方速度可能有点慢&#xff0c;可以下方的使用清华镜像下载 https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/ 点击20.24版本 选择 ubuntu-20.04.6-live-server-amd64.iso 新建虚拟机 下载好后 我们使用 VMware 打开它 这里选…

一篇文章讲透排序算法之归并排序

0.前言 本篇文章将详细解释归并排序的原理&#xff0c;以及递归和非递归的代码原理。 一.概念 归并排序是建立在归并操作上的一种有效的排序算法&#xff0c;该算法是采用分治法的一个非常典型的应用。将已有序的子序列合并&#xff0c;得到完全有序的序列&#xff1b;即先使…

苹果或面临退一赔三,新iPad悄悄砍了核心规格

618 快过去了一半&#xff0c;各家都卖的如火如荼&#xff0c;这其中当属苹果搞得最热火朝天。 某东手机竞速榜中&#xff0c;iPhone15 Pro Max 销量稳坐头把交椅&#xff0c;平板方面虽然没有统计表&#xff0c;但是相信销量也是不差。 加上今年刚刚发布的新系列的 iPad&…

求助!什么软件可以人声分离?手机上可以进行人声分离操作吗?

在数字时代&#xff0c;音频处理变得越来越重要&#xff0c;而人声分离技术则是其中的一项关键技术。很多人可能都有过这样的疑问&#xff1a;什么软件可以实现人声分离&#xff1f;手机上能否进行人声分离操作&#xff1f;今天&#xff0c;我们就来为大家解答这些问题&#xf…