播放器管理系统
- 需求分析
- 详细设计
- 代码实现
- 遇到问题
需求分析
播放器列表管理:
播放器列表管理的主要功能:
- 将歌曲添加到主播放列表
- 将歌曲添加到普通列表
- 通过歌曲id查询播放列表中的歌曲
- 通过歌曲名称查询播放列表中的歌曲
- 修改播放列表中的歌曲
- 删除播放列表中的歌曲
- 显示播放列表的中的所有歌曲
- 导出歌单
播放器管理主要功能:
- 向播放器添加播放列表
- 从播放器删除播放列表
- 通过名字查询播放列表信息
- 显示所有播放列表名称
详细设计
-
类
-
歌曲类(Song)
属性:歌曲(id)、歌曲名(name)、演唱者(singer)、均为字符串类型
方法:
- -构造方法
- -getter和setter方法
- -hashCode()和equals()方法
- -toString()方法
-
播放列表类(PlayList)
属性:
- -播放列表名称(playListName):字符串类型
- -播放列表中的歌曲集合(musicList):List类型
方法:
- -构造方法
- -getter和setter方法
- -将歌曲添加到播放列表:public void addToPlayList(Song song)
- -显示播放列表中所有歌曲:public displayAllSong()
- -通过id查询歌曲:public Song searchSongById(String id)
- -通名称查询歌曲: public Song searchSongByName(String name)
- -修改歌曲:public void updateSong(String id,Song song)
- -从播放列表(通过id)删除歌曲:public void deleteSong(String id)
- -导出所有歌曲
-
播放器类(PlayListCollection)
属性:
-存放播放列表的集合(playListMap):Map
方法:
- -构造方法
- -getter和setter方法
- -添加播放列表:public void addPlayList(PlayList playList);
- -删除播放列表:public void deletePlayList(PlayList playList);
- -通过名字查询:public PlayList searchPlayListByName(String playListName);
- -显示所有播放列表的名称:public void displayPlayListName();
-
测试类(TestDemo)
遇到问题:
- 添加song时,在向List添加元素时,musicList.add(song1);每次添加都会将以前的内容覆盖掉,原因是每次的引用地址都相同。解决方式:在前面代码 加Song song1=new Song();让它每次都产生不一样的引用地址
- 难点重点:Map中的<key,value>,key值存的事列表名称playListName(一个主列表固定,多个普通列表需要自己添加),value值是装歌曲的List类中的ArrayList;遍历value值是一个List对象,将它强转换成(List)再进行List的操作,List遍历后是Song对象,再通过强转成Song类,进行Song的操作,Song类返回值重写toString就可以返回你想要的格式;
代码实现:
Song.java
package com.demo.homework;
public class Song {
private String id;
private String name;
private String singer;
public Song() {
super();
this.setId(id);;
this.setName(name);;
this.setSinger(singer);;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSinger() {
return singer;
}
public void setSinger(String singer) {
this.singer = singer;
}
public String toString() {
return "歌曲编号:"+this.getId()+" "+"歌曲名称:"+this.getName()+" "+"演唱者:"+this.getSinger();
}
}
PlayList.java
package com.demo.homework;
/*
* 播放列表类
*/
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map.Entry;
import java.util.Scanner;
import java.util.Set;
public class PlayList {
private String playListName;// 播放列表名称
public List musicList = new ArrayList();// 播放列表的歌曲集合
public PlayListCollection p = new PlayListCollection();
public List mainList = new ArrayList();//主播放列表
public String mainName;
public String getMainName() {
return mainName;
}
public String setMainName(String mainName) {
return this.mainName = mainName;
}
public List getMainList() {
return mainList;
}
public void setMainList(List mainList) {
this.mainList = mainList;
}
public PlayList() {
this.setMusicList(musicList);
this.setPlayListName(playListName);
}
public String getPlayListName() {
return playListName;
}
public String setPlayListName(String playListName) {
return this.playListName = playListName;
}
public List getMusicList() {
return musicList;
}
public void setMusicList(List musicList) {
this.musicList = musicList;
}
// 将歌曲添加到播放列表
public void addToPlayList(Song song, boolean state) {
Scanner sc = new Scanner(System.in);
if (state) {// 如果点击的是添加到主列表的操作
String key=setMainName("main");
System.out.println("输入添加歌曲的数量:");
int n = sc.nextInt();// 获取歌曲的数量,从而做几次循环
int flag = 0;
while (flag < n) {
Song song1 = new Song();// 每次新建一个对象,让Song的对象产生不同的id
System.out.println("输入第" + (flag + 1) + "首歌曲的id:");
song1.setId(sc.next());
System.out.println("输入第" + (flag + 1) + "首歌曲的名称:");
song1.setName(sc.next());
System.out.println("输入第" + (flag + 1) + "首歌曲的演唱者:");
song1.setSinger(sc.next());
musicList.add(song1);
((List) p.playListMap.get(key)).add(song1);// 使用ArrayList实现一个Key对应一个ArrayList实现一对多
flag++;
}
System.out.println("主播放列表的歌曲为:");
Iterator it=p.playListMap.values().iterator();
while(it.hasNext()) {
Iterator it2=((List)(it.next())).iterator();
while(it2.hasNext()) {
System.out.println(it2.next());}
}
Set<Entry<String, Object>> entrySet = p.playListMap.entrySet();
// 打印输出key-value的值 通过entrySet方法得到key-value
for (Entry<String, Object> entry : entrySet) {
// entry.getValue();
// entry.getKey();
System.out.println(entry.getKey() + "-" + entry.getValue());
}
new TestDemo().playListMenu();
}
/*
* 当state为false时,点击的是普通列表的操作
*/
System.out.println("输入你要添加的列表名称:");
String s = sc.next();
if (new PlayListCollection().playListMap.isEmpty())
System.out.println("还没创建列表");
if (!new PlayListCollection().playListMap.containsKey(s))// 判断是否存在此列表
{
System.out.println("列表不存在");
new TestDemo().playListMenu();
} else {
System.out.println("输入添加歌曲的数量:");
int n = sc.nextInt();// 获取歌曲的数量,从而做几次循环
int flag = 0;
while (flag < n) {
Song song1 = new Song();// 每次新建一个对象,让Song的对象产生不同的id
System.out.println("输入第" + (flag + 1) + "首歌曲的id:");
song1.setId(sc.next());
System.out.println("输入第" + (flag + 1) + "首歌曲的名称:");
song1.setName(sc.next());
System.out.println("输入第" + (flag + 1) + "首歌曲的演唱者:");
song1.setSinger(sc.next());
musicList.add(song1);
((List) p.playListMap.get(s)).add(song1);// 使用ArrayList实现一个Key对应一个ArrayList实现一对多
flag++;
}
System.out.println("普通列表的歌曲为");
for (int i = 0; i < musicList.size(); i++)
{
System.out.println(musicList.get(i));}
}
Set<Entry<String, Object>> entrySet = p.playListMap.entrySet();
// 打印输出key-value的值 通过entrySet方法得到key-value
for (Entry<String, Object> entry : entrySet) {
// entry.getValue();
// entry.getKey();
System.out.println(entry.getKey() + "-" + entry.getValue());
}
new TestDemo().playListMenu();
}
// 显示播放列表中所有歌曲
public void displayAllSong() {
boolean flag=false;
//使用KeySet()
//1取得keySet
Set<String> keySet=p.playListMap.keySet();
//2遍历keySet
for(String key:keySet) {
if("main".equals(key)) {
flag=true;
System.out.println("主播放列表歌曲为");
Iterator it2=((List)(p.playListMap.get(key))).iterator();
while(it2.hasNext()) {
System.out.println(it2.next());}
break;
}
Set<Entry<String, Object>> entrySet = p.playListMap.entrySet();
// 打印输出key-value的值 通过entrySet方法得到key-value
for (Entry<String, Object> entry : entrySet) {
// entry.getValue();
// entry.getKey();
//System.out.println(entry.getKey() + "-" + entry.getValue());
// System.out.println(entry.getKey());//获取key的值
//2遍历keySet
for(String key2:keySet) {
if(entry.getKey().equals(key)) {
flag=true;
System.out.println("普通播放列表歌曲为");
Iterator it2=((List)(p.playListMap.get(entry.getKey()))).iterator();
while(it2.hasNext()) {
System.out.println(((Song)(it2.next())));
//System.out.println(it2.next());
}
break;
}}}
}}
// 通过id查询歌曲
public Song searchSongById(String id) {
Scanner sc=new Scanner(System.in);
System.out.println("输入你要搜索的歌曲id");
String searchId=sc.next();
Song song=new Song();
boolean flag=false;
//通过entrySet方法得到key-value
Set<Entry<String, Object>> entrySet = p.playListMap.entrySet();
// 打印输出key-value的值 通过entrySet方法得到key-value
for (Entry<String, Object> entry : entrySet) {
Set<String> keySet=p.playListMap.keySet();
//List的遍历,通过get(key)得到value因为value是List所以强转换成List类型。再用List遍历
Iterator it2=((List)(p.playListMap.get(entry.getKey()))).iterator();
while(it2.hasNext()){
song=(Song)it2.next();//将找到的数据转换成song,如果满足与输入结果相同,则返回这个结果
if(song.getId().equals(searchId)) {
flag=true;
System.out.println(song);
break;
}
}}
if(flag)
System.out.println("搜索成功");
else {
System.out.println("无此歌曲id");
}
return song;
}
// 通过名称查询歌曲
public Song searchSongByName(String name) {
Scanner sc=new Scanner(System.in);
System.out.println("输入你要搜索的歌曲名称");
String searchName=sc.next();
Song song=new Song();
boolean flag=false;
//通过entrySet方法得到key-value
Set<Entry<String, Object>> entrySet = p.playListMap.entrySet();
// 打印输出key-value的值 通过entrySet方法得到key-value
for (Entry<String, Object> entry : entrySet) {
Set<String> keySet=p.playListMap.keySet();
//List的遍历,通过get(key)得到value因为value是List所以强转换成List类型。再用List遍历
Iterator it2=((List)(p.playListMap.get(entry.getKey()))).iterator();
while(it2.hasNext()){
song=(Song)it2.next();//将找到的数据转换成song,如果满足与输入结果相同,则返回这个结果
if(song.getName().equals(searchName)) {
flag=true;
System.out.println(song);
break;
}
}}
if(flag)
System.out.println("搜索成功");
else {
System.out.println("无此歌曲名称");
}
return song;
}
// 修改歌曲
public void updateSong(String id, Song song) {
Scanner sc=new Scanner(System.in);
System.out.println("输入你要更新的歌曲id");
String searchId=sc.next();
song=new Song();
boolean flag=false;
//通过entrySet方法得到key-value
Set<Entry<String, Object>> entrySet = p.playListMap.entrySet();
// 打印输出key-value的值 通过entrySet方法得到key-value
for (Entry<String, Object> entry : entrySet) {
Set<String> keySet=p.playListMap.keySet();
//List的遍历,通过get(key)得到value因为value是List所以强转换成List类型。再用List遍历
Iterator it2=((List)(p.playListMap.get(entry.getKey()))).iterator();
while(it2.hasNext()){
song=(Song)it2.next();//将找到的数据转换成song,如果满足与输入结果相同,则返回这个结果
if(song.getId().equals(searchId)) {
flag=true;
((List)(p.playListMap.get(entry.getKey()))).remove(song);
System.out.println("输入你修改后的歌曲名称");
song.setName(sc.next());
System.out.println("输入你修改后的歌曲演唱者");
song.setSinger(sc.next());
System.out.println(song);
break;
}
}}
if(flag)
System.out.println("修改成功");
else {
System.out.println("无此歌曲id");
}
}
public void outPut() {
System.out.println("为输入导出的歌单命名");
Scanner sc=new Scanner (System.in);
//创建File文件 song.txt
File file=new File("/Users/mac/Documents/java/demo/",sc.next()+".txt");
if(!file.exists()) {//判断文件是否存在
System.out.println("创建成功");
try {
file.createNewFile();
PrintStream ps = System.out;//临时存一下
System.setOut(new PrintStream(file));//将system.out 的内容打印到.txt内
this.displayAllSong();
System.setOut(ps);//设置回标准输入流
new TestDemo().playListMenu();
}
catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
else {
System.out.println("文件名已存在");
outPut();
}
}
// 从播放列表删除歌曲
public void deleteSong(String id) {
Scanner sc=new Scanner(System.in);
System.out.println("输入你要删除的歌曲id");
String searchId=sc.next();
Song song=new Song();
boolean flag=false;
//通过entrySet方法得到key-value
Set<Entry<String, Object>> entrySet = p.playListMap.entrySet();
// 打印输出key-value的值 通过entrySet方法得到key-value
for (Entry<String, Object> entry : entrySet) {
Set<String> keySet=p.playListMap.keySet();
//List的遍历,通过get(key)得到value因为value是List所以强转换成List类型。再用List遍历
Iterator it2=((List)(p.playListMap.get(entry.getKey()))).iterator();
while(it2.hasNext()){
song=(Song)it2.next();//将找到的数据转换成song,如果满足与输入结果相同,则返回这个结果
if(song.getId().equals(searchId)) {
flag=true;
((List)(p.playListMap.get(entry.getKey()))).remove(song);
break;
}
}}
if(flag)
System.out.println("删除歌曲成功");
else {
System.out.println("无此歌曲id");
}
}
}
PlayListCollection.java
package com.demo.homework;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Scanner;
import java.util.Set;
public class PlayListCollection {
static Map<String,Object> playListMap=new HashMap<String,Object>();//存放播放列表的集合
static List<Song> list=new ArrayList();
//添加播放列表
public void addPlayList(PlayList playList) {
Scanner sc=new Scanner(System.in);
String key=playList.setPlayListName(sc.next());
List value=playList.getMusicList();
playListMap.put(key, value);
//sc.close();
Set <Entry<String,Object>> entrySet=playListMap.entrySet();
//打印输出key-value的值 通过entrySet方法得到key-value
for(Entry<String, Object> entry:entrySet) {
//entry.getValue();
//entry.getKey();
System.out.println(entry.getKey()+"-"+entry.getValue());
}
}
//删除播放列表
public void deletePlayList(PlayList playList) {
Scanner sc=new Scanner(System.in);
//通过输入的列表名称删除播放列表
System.out.println("输入你要删除的播放列表名称");
if(playListMap.containsKey(sc.next())) {//如果列表有这个名称,则进行删除操作
playListMap.remove(sc.next());
System.out.println("删除列表成功");
}
else {
System.out.println("无此播放列表");
}
}
//通过名字查询播放列表
public PlayList searchPlayListByName(String PlayListname) {
Scanner sc=new Scanner(System.in);
System.out.println("输入你查询的播放列表名称");
String key=sc.next();
//通过输入的列表名称删除播放列表
if(playListMap.containsKey(key)) {//如果列表有这个名称,则进行删除操作
if(((List)(playListMap.get(key))).size()==0) //如果为空表
{System.out.println("该列表为空");}
else {
System.out.println("查询列表成功");
System.out.println(playListMap.get(key));
}
}
else {
System.out.println("无此播放列表");
}
return null;
}
//显示所有播放列表的名称
public void displayPlayListName() {
Set<Entry<String,Object>>entrySet=playListMap.entrySet();
System.out.println("找到以下列表");
for(Entry<String,Object>entry:entrySet) {
System.out.println(entry.getKey());
}
}
}
TestDemo.java
package com.demo.homework;
import java.util.List;
import java.util.Scanner;
public class TestDemo {
public static PlayListCollection p = new PlayListCollection();
//测试歌曲类
public void testSong() {
}
//测试播放列表类
public void testPlayList() {
}
//测试播放器类
public void testPlayListCollection() {
}
//主菜单
public void mainMenu(){
System.out.println("**************");
System.out.println("主菜单");
System.out.println("1--播放器列表管理");
System.out.println("2--播放器管理");
System.out.println("0--退出");
System.out.println("**************");
System.out.println("请输入对应数字进行操作:");
//从键盘中接受数据
Scanner sc=new Scanner(System.in);
while(!sc.hasNext("0")) {//扫描到0就退出循环
int n=sc.nextInt();
switch(n) {
case 1:new TestDemo().playListMenu();break;//显示播放器列表管理
case 2:new TestDemo().playMenu();break;//播放器管理
case 0:break;
}
}
}
//播放列表菜单
public void playListMenu() {
System.out.println("**************");
System.out.println("播放列表管理");
System.out.println("1--将歌曲添加到主播放列表");
System.out.println("2--将歌曲添加到普通播放列表");
System.out.println("3--通过歌曲id查询播放列表中的歌曲");
System.out.println("4--通过歌曲名称查询播放列表中的歌曲");
System.out.println("5--修改播放列表中的歌曲");
System.out.println("6--删除播放列表中的歌曲");
System.out.println("7--显示播放列中的所有歌曲");
System.out.println("8--导出播放列表中的所有歌曲");
System.out.println("9--返回上一级菜单");
System.out.println("**************");
System.out.println("请输入对应数字对播放列表进行操作:");
//从键盘中接受数据
Scanner sc=new Scanner(System.in);
while(sc.hasNext()) {
int n=sc.nextInt();
PlayList playList=new PlayList();
Song song=new Song();
switch(n) {//a无任何意义
case 1:playList.addToPlayList(song,true);break;//显示播放器列表管理
case 2:playList.addToPlayList(song,false);break;//播放器管理
case 3:playList.searchSongById("a");break;//通过id找歌曲
case 4:playList.searchSongByName("a");break;//通过id找歌曲
case 5:playList.updateSong("a", song);;break;//通过名称找歌曲
case 6:playList.deleteSong("a");;break;//通过id删除歌曲
case 7:playList.displayAllSong();break;//显示所有歌曲
case 8:playList.outPut();break;//导出歌单,放到一个文本里面
case 9:mainMenu();break;//返回上一个
case 0:break;
}}
}
//播放器菜单
public void playMenu() {
System.out.println("**************");
System.out.println("播放器管理");
System.out.println("1--向播放器添加播放列表");
System.out.println("2--从播放器删除播放列表");
System.out.println("3--通过名字查询播放列表");
System.out.println("4--显示所有播放列表名称");
System.out.println("9--返回上一级菜单");
System.out.println("**************");
System.out.println("请输入对应数字对播放器进行操作:");
//从键盘中接受数据
PlayList playList=new PlayList();
Scanner sc=new Scanner(System.in);
while(sc.hasNext()) {//扫描到0就退出循环
int n=sc.nextInt();
switch(n) {
case 1:new PlayListCollection().addPlayList(new PlayList());break;//显示播放器列表管理
case 2:new PlayListCollection().deletePlayList(playList);break;//通过名称删除播放列表
case 3:new PlayListCollection().searchPlayListByName("a");break;//通过名称显示播放列表
case 4:new PlayListCollection().displayPlayListName();break;//显示所以播放列表
case 9:new TestDemo().playListMenu();break;//播放器管理
case 0:break;
}
}
}
public static void main(String[] args) {
String key="main";
List value=new PlayList().getMainList();
p.playListMap.put(key, value);
new TestDemo().mainMenu();
}
}