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

目录

一、设计程序

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

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

参考代码
歌曲类
java 复制代码
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的方法判等
    @Override
    public 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);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name);
    }

    @Override
    public String toString() {
        return "Song{" +
                "name='" + name + '\'' +
                '}';
    }
}
歌单类
java 复制代码
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;

    }
    @Override
    public String toString() {
        return "SongSheet{" +
                "songList=" + songList +
                '}';
    }
}
KTV类
java 复制代码
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);
    }


}
测试类
java 复制代码
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方法判断是否相等。

最后

如果感觉有收获的话,点个赞 👍🏻 吧。

❤️❤️❤️本人菜鸟修行期,如有错误,欢迎各位大佬评论批评指正!😄😄😄

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

相关推荐
hanbarger6 分钟前
mybatis框架——缓存,分页
java·spring·mybatis
cdut_suye13 分钟前
Linux工具使用指南:从apt管理、gcc编译到makefile构建与gdb调试
java·linux·运维·服务器·c++·人工智能·python
苹果醋325 分钟前
2020重新出发,MySql基础,MySql表数据操作
java·运维·spring boot·mysql·nginx
小蜗牛慢慢爬行27 分钟前
如何在 Spring Boot 微服务中设置和管理多个数据库
java·数据库·spring boot·后端·微服务·架构·hibernate
azhou的代码园30 分钟前
基于JAVA+SpringBoot+Vue的制造装备物联及生产管理ERP系统
java·spring boot·制造
wm10431 小时前
java web springboot
java·spring boot·后端
smile-yan1 小时前
Provides transitive vulnerable dependency maven 提示依赖存在漏洞问题的解决方法
java·maven
老马啸西风1 小时前
NLP 中文拼写检测纠正论文-01-介绍了SIGHAN 2015 包括任务描述,数据准备, 绩效指标和评估结果
java
Earnest~1 小时前
Maven极简安装&配置-241223
java·maven
皮蛋很白1 小时前
Maven 环境变量 MAVEN_HOME 和 M2_HOME 区别以及 IDEA 修改 Maven repository 路径全局
java·maven·intellij-idea