往普通列表添加歌曲出现问题
package com.imooc.model;
public class Song {
private String id;
private String name;
private String singer;
//无参构造
public Song() {
}
//带参构造
public Song(String id, String name, String singer) {
this.id = id;
this.name = name;
this.singer = singer;
}
//getter/setter方法
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;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + ((singer == null) ? 0 : singer.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
//判断对象是否相等
if(this==obj) {
return true;
}
//判断obj是否为Song类
if(obj.getClass()==Song.class) {
Song song = (Song)obj;
return song.getId().equals(id)&&song.getName().equals(name)&&song.getSinger().equals(singer);
}
return false;
}
@Override
public String toString() {
return "歌曲信息 : id=" + id + ", name=" + name + ", singer=" + singer;
}
}package com.imooc.model;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class PlayList {
// 属性:播放列表名称、播放列表中的List集合
private String playListName;
List<Song> musicList = new ArrayList<Song>();
// 构造方法
public PlayList() {
}
public PlayList(String playListName, List<Song> musicList) {
this.playListName = playListName;
this.musicList = musicList;
}
// getter/setter方法
public String getPlayListName() {
return playListName;
}
public void setPlayListName(String playListName) {
this.playListName = playListName;
}
public List<Song> getMusicList() {
return musicList;
}
public void setMusicList(List<Song> musicList) {
this.musicList = musicList;
}
// 将歌曲添加到播放列表
public void addToPlayList(Song song) {
// song在传进来之前先完成属性赋值,循环遍历播放列表,判断该歌曲是否存在
boolean flag = true;
for (int i = 0; i < musicList.size(); i++) {
if (musicList.get(i).getId().equals(song.getId()) && musicList.get(i).getName().equals(song.getName())
&& musicList.get(i).getSinger().equals(song.getSinger())) {
System.out.println("该歌曲已存在!");
flag = false;
break;
}
}
if (flag) {
musicList.add(song);
}
}
// 显示播放列表中所有歌曲
public void displayAllSong() {
if (musicList.size() == 0) {
System.out.println("当前播放列表为空");
} else {
for (int i = 0; i < musicList.size(); i++) {
System.out.println(musicList.get(i).toString());
}
}
}
// 通过id查询歌曲
public Song searchSongById(String id) {
Song song = new Song();
boolean flag = true;
for (int i = 0; i < musicList.size(); i++) {
if (id.equals(musicList.get(i).getId())) {
song = musicList.get(i);
//System.out.println(song.toString());
flag = false;
break;
}
}
if (flag) {
song=null;
}
return song;
}
// 通过名称查询歌曲
public Song searchSongByName(String name) {
Song song = new Song();
boolean flag = true;
for (int i = 0; i < musicList.size(); i++) {
if (name.equals(musicList.get(i).getId())) {
song = musicList.get(i);
flag = false;
break;
}
}
if (flag) {
song=null;
}
return song;
}
// 修改歌曲
public void updateSong(Song song,String name,String singer) {
song.setName(name);
song.setSinger(singer);
}
/*public void updateSong(String id, String name, String singer) {
for (int i = 0; i < musicList.size(); i++) {
Song song = musicList.get(i);
if (id.equals(song.getId())) {
song.setName(name);
song.setSinger(singer);
//musicList.add(song);
break;
}
}
}*/
// 从播放列表删除歌曲
public void deleteSong(String id) {
for (int i = 0; i < musicList.size(); i++) {
Song song = musicList.get(i);
if (id.equals(song.getId())) {
musicList.remove(song);
break;
}
}
}
// 导出歌单
public void exportPlayList() {
}
}package com.imooc.model;
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 {
// 属性:存放播放列表的集合:Map
private Map<String, PlayList> map = new HashMap<String, PlayList>();
Scanner sc = new Scanner(System.in);
// 无参构造
public PlayListCollection() {
}
// 带参构造
public PlayListCollection(Map<String, PlayList> map) {
this.map = map;
}
// getter/setter方法
public Map<String, PlayList> getMap() {
return map;
}
public void setMap(Map<String, PlayList> map) {
this.map = map;
}
// 方法:添加播放列表
public void addPlayList(PlayList playList) {
System.out.println("向播放器中添加播放列表");
System.out.println("请输入要添加的播放列表名称:");
String name = sc.next();
map.put(name, playList);
System.out.println("添加成功!");
}
// 方法:删除播放列表
public void deletePlayList(PlayList playList) {
System.out.println("删除播放列表");
if (map.size() == 0) {
System.out.println("当前没有播放列表,请先创建播放列表");
} else {
System.out.println("请输入要删除的播放列表:");
String collection = sc.next();
//取得keySet
Set<String> keySet = map.keySet();
boolean flag = true;
for(String set:keySet) {
if(set.equals(collection)) {
map.remove(set);
System.out.println("删除成功!");
flag = false;
break;
}
}
if(flag) {
System.out.println("该播放列表不存在");
}
}
}
// 方法:通过名字查询播放列表
public PlayList searchPlayListByName(String playListName) {
if(map.size()==0) {
System.out.println("当前播放列表为空");
}else {
Set<String> keySet = map.keySet();
boolean flag = true;
for(String key:keySet) {
if(key.equals(playListName)) {
System.out.println("该播放列表存在");
System.out.println("该播放列表名称为:"+key);
System.out.print("播放列表中所有歌曲为:");
map.get(key).displayAllSong();
flag = false;
}
}
if(flag) {
System.out.println("该播放列表不存在");
}
}
return null;
}
//方法:通过id查询歌曲信息
public void searchSongById(String id,String playListName) {
Set<String> keySet = map.keySet();
boolean flag = true;
for(String key:keySet) {
if(key.equals(playListName)) {
map.get(key).searchSongById(id);
break;
}else {
System.out.println("歌曲不存在!");
}
}
}
//方法:通过歌曲名称查询歌曲信息
public void searchSongByName(String name,String playListName) {
Set<String> keySet = map.keySet();
boolean flag = true;
for(String key:keySet) {
if(key.equals(playListName)) {
map.get(key).searchSongByName(name);
break;
}else {
System.out.println("歌曲不存在!");
}
}
}
//修改歌曲信息,所有列表中该歌曲信息都被修改
//如果歌曲id不存在,应该怎么提示?
/*public void updateSong(String id) {
Set<String> keySet = map.keySet();
System.out.println("请输入修改后的名称:");
String name = sc.next();
System.out.println("请输入修改后的演唱者:");
String singer = sc.next();
for(String key:keySet) {
PlayList playList = map.get(key);
playList.updateSong(id,name,singer);
System.out.println("修改成功!");
}
}*/
//删除歌曲信息
/*public void deleteSong() {
System.out.println("请输入要删除的歌曲id:");
String id = sc.next();
Set<String> keySet = map.keySet();
for(String key:keySet) {
PlayList playList = map.get(key);
playList.deleteSong(id);
System.out.println("删除成功!");
}
}*/
// 方法:显示所有播放列表名称
public void displayPlayList() {
System.out.println("显示所有播放列表名称");
if(map.size()==0) {
System.out.println("当前播放列表为空!");
}else {
Set<Entry<String,PlayList>> entrySet = map.entrySet();
for(Entry<String,PlayList> entry:entrySet) {
System.out.println(entry.getKey());
}
}
}
//判断播放列表是否存在
public boolean booleanList(String listName) {
boolean flag=false;
Set<String> keySet = map.keySet();
for(String key:keySet) {
if(key.equals(listName)) {
flag = true;
break;
}
}
return flag;
}
}package com.imooc.test;
import java.util.List;
import java.util.Scanner;
import java.util.Set;
import com.imooc.model.PlayList;
import com.imooc.model.PlayListCollection;
import com.imooc.model.Song;
public class TestDemo {
// 主菜单
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("请输入对应数字进行操作:");
}
// 播放管理菜单
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("请输入对应数字进行操作:");
}
// 播放器菜单
public void playerMenu() {
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(" 5-返回上一级菜单");
System.out.println("********************************");
System.out.println("请输入对应数字进行操作:");
}
public static void main(String[] args) {
TestDemo test = new TestDemo();
Song song = new Song();
PlayList playList = new PlayList();
// PlayList playList1 = new PlayList();
PlayListCollection player = new PlayListCollection();
player.getMap().put("主播放列表", playList);
test.mainMenu();
Scanner sc = new Scanner(System.in);
boolean flag = true;
while (flag) {
int i = sc.nextInt();
switch (i) {
case 1:
test.playListMenu();
boolean flag1 = true;
while (flag1) {
int j = sc.nextInt();
switch (j) {
case 1:
// 将主播放列表设置为默认存在的
System.out.println("将歌曲添加到主播放列表:");
System.out.println("请输入添加歌曲数量:");
int x = sc.nextInt();
for (int y = 1; y <= x; y++) {
System.out.println("请输入第" + y + "首歌曲id:");
song.setId(sc.next());
System.out.println("请输入第" + y + "首歌曲名称:");
song.setName(sc.next());
System.out.println("请输入第" + y + "首演唱者:");
song.setSinger(sc.next());
playList.addToPlayList(song);
player.getMap().put("主播放列表", playList);
song = new Song();
}
// playList = new PlayList();
test.playListMenu();
break;
case 2:
System.out.println("将歌曲添加到普通播放列表:");
if (player.getMap().size() == 1 && player.getMap().containsKey("主播放列表")) {
System.out.println("还未创建普通播放列表!");
} else {
System.out.println("请输入要添加的播放列表名称:");
String name = sc.next();
// boolean flag3 = player.booleanList(name);
boolean flag3 = true;
for(String key:player.getMap().keySet()) {
if(key.equals(name)) {
flag3=false;
PlayList playList1 = player.getMap().get(key);
System.out.println("请输入要添加的歌曲数量:");
int n = sc.nextInt();
for (int m = 1; m <= n; m++) {
System.out.println("请输入第" + m + "首歌曲id:");
String id = sc.next();
boolean f = true;
PlayList pl = player.getMap().get("主播放列表");
for (int a = 0; a < pl.getMusicList().size(); a++) {
Song s = pl.getMusicList().get(a);
if (s.getId().equals(id)) {
System.out.println("第" + m + "首歌曲添加成功");
playList1.addToPlayList(s);
f = false;
break;
}
}
if (f) {
System.out.println("该歌曲在主播放列表中不存在,请继续输入其他信息");
// 此时添加的歌曲也要加进主播放列表中
song.setId(id);
System.out.println("请输入歌曲名称:");
song.setName(sc.next());
System.out.println("请输入演唱者");
song.setSinger(sc.next());
playList1.addToPlayList(song);
playList.addToPlayList(song);
System.out.println("第" + m + "首歌曲添加成功");
player.getMap().put("主播放列表", playList);
song = new Song();
}
}
player.getMap().put(name, playList1);
System.out.println("歌曲添加成功!");
break;
}
}
if (flag3) {
System.out.println("该播放列表不存在!");
}
}
test.playListMenu();
break;
case 3:
System.out.println("请输入要查询的播放列表:");
String listName = sc.next();
boolean flag3 = player.booleanList(listName);
if (flag3) {
System.out.println("请输入要查询的歌曲id:");
String id = sc.next();
player.searchSongById(id, listName);
} else {
System.out.println("该播放列表不存在!");
}
test.playListMenu();
break;
case 4:
System.out.println("请输入要查询的播放列表:");
String listName2 = sc.next();
boolean flag4 = player.booleanList(listName2);
if (flag4) {
System.out.println("请输入要查询的歌曲名称:");
String name = sc.next();
player.searchSongById(name, listName2);
} else {
System.out.println("该播放列表不存在!");
}
test.playListMenu();
break;
case 5:
// 修改一个列表之后,其他所有列表信息都随之改变
System.out.println("请输入要修改的歌曲id:");
String id1 = sc.next();
System.out.println("请输入修改后的歌曲名称:");
String name1 = sc.next();
System.out.println("请输入修改后的演唱者:");
String singer1 = sc.next();
boolean flag5 = true;
for (String key : player.getMap().keySet()) {
Song song1 = player.getMap().get(key).searchSongById(id1);
if (song1 == null) {
System.out.println("id不存在");
} else {
player.getMap().get(key).updateSong(song1, name1, singer1);
}
}
test.playListMenu();
break;
case 6:
// 在普通播放列表删除歌曲之后,主播放列表及其他列表中信息不变
// 在主播放列表中删除歌曲后,普通播放列表中的歌曲也随之删除
System.out.println("请输入要删除的歌曲id:");
boolean flag6 = true;
String id2 = sc.next();
for (String key : player.getMap().keySet()) {
List<Song> list = player.getMap().get(key).getMusicList();
for (int b = 0; b < list.size(); b++) {
if (id2.equals(list.get(b).getId())) {
player.getMap().get(key).deleteSong(id2);
System.out.println("删除成功!");
flag6 = false;
break;
}
}
}
if (flag6) {
System.out.println("id不存在!");
}
test.playListMenu();
break;
case 7:
System.out.println("请输入要显示的播放列表:");
String listName1 = sc.next();
boolean flag7 = player.booleanList(listName1);
if (flag7) {
player.searchPlayListByName(listName1);
} else {
System.out.println("该播放列表不存在!");
}
test.playListMenu();
break;
case 8:// 对象序列化,列表名称+的歌单.txt
System.out.println("请输入要导出的歌单:");
test.playListMenu();
break;
case 9:
flag1 = false;
test.mainMenu();
break;
default:
System.out.println("输入信息不正确,请重新输入");
break;
}
}
break;
case 2:
test.playerMenu();
boolean flag2 = true;
while (flag2) {
int k = sc.nextInt();
switch (k) {
case 1:
player.addPlayList(playList);
test.playerMenu();
break;
case 2:
player.deletePlayList(playList);
test.playerMenu();
break;
case 3:
System.out.println("请输入要查询的播放列表名称:");
String playListName = sc.next();
player.searchPlayListByName(playListName);
test.playerMenu();
break;
case 4:
player.displayPlayList();
test.playerMenu();
break;
case 5:
flag2 = false;
test.mainMenu();
break;
default:
System.out.println("输入信息不正确,请重新输入!");
test.playerMenu();
break;
}
}
break;
case 0:
flag = false;
break;
default:
System.out.println("输入信息不正确,请重新输入!");
test.mainMenu();
break;
}
}
}
}按照老师提供的思路,往普通列表添加歌曲时,先遍历集合判断该列表是否存在,然后获取该列表的playList,但是我的代码出现了问题
正在回答
修改意见,
1、如下图所示,创建一个主播放列表对象,为了形象一点,我起名为mainPlayList,然后将mainPlayList对象添加到播放器中。

在case1中,需要将歌曲信息添加到主播放列表中,所以使用mainPlayList对象调用addPlayList方法将歌曲信息添加进主播放列表中,可以参照下图进行修改。

然后在case2中,当获得普通播放列表的对象时,使用普通播放列表对象调用addToPlayList方法,这样你的歌曲信息就不会乱了,建议你在代码中添加适量的注释,不要定义那么多相似的变量信息,很容易搞混。
2、在searchPlayListByName方法中你不应该只返回null,可以这么修改,如果在该方法中有对应的播放列表,就返回该播放列表的对象,如果没有则返回null,这样在测试类中,我们就可以通过该方法返回的值进行操作了,譬如case2中的逻辑可以这么写,当从控制台接收用户录入的播放列表名称时,我们可以调用该方法,如果播放列表存在,则返回该播放列表的对象,然后使用该对象调用添加歌曲的方法,如果播放列表不存在,则返回null,则提示用户该播放列表不存在,这种逻辑就清晰简单。如果有不明白的地方还可以继续提问,祝学习愉快~
- 参与学习 人
- 提交作业 7317 份
- 解答问题 14452 个
想要入门学编程?多年一直活跃在编程语言排行版前列的Java是一个很好的选择。本路径将从Java基础语法、面向对象、常用工具类三部分,为你开启软件开发的大门!
了解课程


恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星