老师,我的代码中无法删除歌曲信息,修改歌曲信息时出现异常,请老师帮忙解决一下,谢谢!
package com.imooc.player;
import java.io.Serializable;
public class Song implements Serializable{
private String id;
private String name;
private String singer;
public Song() {
}
public Song(String id, String name, String singer) {
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;
}
@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;
}
if(obj.getClass()==Song.class) {
Song song = (Song) obj;
return (song.getId().equals(getId()))&&(song.getName().equals(getName()))&&(song.getSinger().equals(getSinger()));
}
else {
return false;
}
}
@Override
public String toString() {
return "歌曲信息:id为"+this.getId()+",歌曲名称为:"+this.getName()+",演唱者为:"+this.getSinger();
}
}
package com.imooc.player;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.InputMismatchException;
import java.util.List;
import java.util.Scanner;
import java.util.Set;
public class PlayList {
private String playListName;
private List<Song> musicList = new ArrayList<>();
private Scanner sc;
public PlayList() {
}
public PlayList(String playListName, List<Song> musicList) {
this.setPlayListName(playListName);
this.setMusicList(musicList);
}
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 addToMainPlayList(PlayListCollection plc) {
System.out.println("请输入要添加的歌曲的数量:");
int number;
while (true) {
try {
sc = new Scanner(System.in);
number = sc.nextInt();
break;
} catch (InputMismatchException e) {
System.out.println("错误!请输入数字");
}
}
for (int i = 1; i <= number; i++) {
System.out.println("请输入第" + i + "首歌曲:");
System.out.println("请输入歌曲的id:");
String strId = sc.next();
System.out.println("请输入歌曲名:");
String strName = sc.next();
System.out.println("请输入演唱者:");
String strSinger = sc.next();
Song s = new Song(strId, strName, strSinger);
plc.getPlayListMap().get("主播放列表").musicList.add(s);
}
}
public void addToPlayList(PlayListCollection plc) {
System.out.println("请输入要添加的播放列表名称:");
sc = new Scanner(System.in);
String playListName = sc.next();
boolean flag = false;
Set<String> set = plc.getPlayListMap().keySet();
for (String temp : set) {
if (playListName.equals(temp)) {
flag = true;
break;
}
}
if (flag) {
System.out.println("请输入要添加的歌曲的数量:");
int number;
while (true) {
try {
sc = new Scanner(System.in);
number = sc.nextInt();
break;
} catch (InputMismatchException e) {
System.out.println("错误,请输入整数!");
}
}
int index = 0;
while (index < number) {
System.out.println("请输入第" + (index + 1) + "首歌曲:");
sc = new Scanner(System.in);
System.out.println("请输入歌曲的id:");
String strId = sc.next();
boolean flag1 = false;
Song temp = null;
for (Song tmp : plc.getPlayListMap().get("主播放列表").musicList) {
if (strId.equals(tmp.getId())) {
temp = tmp;
flag1 = true;
break;
}
}
if (flag1) {
plc.getPlayListMap().get(playListName).musicList.add(temp);
index++;
continue;
} else {
System.out.println("请输入歌曲的名称:");
String strName = sc.next();
System.out.println("请输入演唱者:");
String strSinger = sc.next();
Song s = new Song(strId, strName, strSinger);
plc.getPlayListMap().get(playListName).musicList.add(s);
plc.getPlayListMap().get("主播放列表").musicList.add(s);
index++;
}
}
} else {
System.out.println("该播放列表不存在,请先将播放列表添加到播放器中!");
}
}
public void displayAllSongs(PlayListCollection plc) {
System.out.println("请输入要显示的播放列表名称:");
sc = new Scanner(System.in);
String playListName = sc.next();
boolean flag = false;
Set<String> set = plc.getPlayListMap().keySet();
for (String temp : set) {
if (playListName.equals(temp)) {
flag = true;
break;
}
}
if (flag) {
for (Song temp : plc.getPlayListMap().get(playListName).musicList) {
System.out.println(temp);
}
} else {
System.out.println("该播放列表不存在!");
}
}
public Song searchSongById(PlayListCollection plc) {
System.out.println("请输入要查询的播放列表名称:");
sc = new Scanner(System.in);
String playListName = sc.next();
boolean flag = false;
Set<String> set = plc.getPlayListMap().keySet();
for (String temp : set) {
if (playListName.equals(temp)) {
flag = true;
break;
}
}
if (flag) {
System.out.println("请输入要查询的歌曲id:");
sc = new Scanner(System.in);
String searchId = sc.next();
boolean flag1 = false;
Song temp = null;
for (Song tmp : plc.getPlayListMap().get(playListName).musicList) {
if (searchId.equals(tmp.getId())) {
flag1 = true;
temp = tmp;
break;
}
}
if (flag1) {
System.out.println("该歌曲的信息为:");
return temp;
} else {
System.out.println("该歌曲在播放列表" + playListName + "中不存在!");
return null;
}
} else {
System.out.println("该播放列表不存在!");
return null;
}
}
public Song searchSongByName(PlayListCollection plc) {
System.out.println("请输入要查询的播放列表名称:");
sc = new Scanner(System.in);
String playListName = sc.next();
boolean flag = false;
Set<String> set = plc.getPlayListMap().keySet();
for (String temp : set) {
if (playListName.equals(temp)) {
flag = true;
break;
}
}
if (flag) {
System.out.println("请输入要查询的歌曲名称:");
sc = new Scanner(System.in);
String searchName = sc.next();
boolean flag1 = false;
Song temp = null;
for (Song tmp : plc.getPlayListMap().get(playListName).musicList) {
if (searchName.equals(tmp.getName())) {
flag1 = true;
temp = tmp;
break;
}
}
if (flag1) {
System.out.println("该歌曲的信息为:");
return temp;
} else {
System.out.println("该歌曲在"+playListName+"中不存在!");
return null;
}
} else {
System.out.println("该播放列表不存在!");
return null;
}
}
public void updateSong(PlayListCollection plc) {
System.out.println("请输入要修改的歌曲id:");
sc = new Scanner(System.in);
String modifyId = sc.next();
Set<String> set = plc.getPlayListMap().keySet();
boolean flag = false;
for(String temp: set) {
PlayList p = plc.getPlayListMap().get(temp);
for(Song tmp: p.getMusicList()) {
if(modifyId.equals(tmp.getId())) {
flag = true;
break;
}
}
}
if(flag) {
System.out.println("请输入修改后的歌曲名:");
String modifyName = sc.next();
System.out.println("请输入修改后的演唱者:");
String modifySinger = sc.next();
for(String temp: set) {
PlayList p1 = plc.getPlayListMap().get(temp);
for(Song tmp: p1.getMusicList()) {
if(modifyId.equals(tmp.getId())) {
p1.getMusicList().remove(modifyId);
Song modifySong = new Song(modifyId, modifyName, modifySinger);
p1.getMusicList().add(modifySong);
}
}
}
System.out.println("修改成功!");
}else {
System.out.println("该歌曲不存在!");
}
}
public void deleteSong(PlayListCollection plc) {
System.out.println("请输入要删除的歌曲id:");
sc = new Scanner(System.in);
String deleteId = sc.next();
Set<String> set = plc.getPlayListMap().keySet();
boolean flag = false;
for(String temp: set) {
PlayList p = plc.getPlayListMap().get(temp);
for(Song tmp: p.musicList) {
if(deleteId.equals(tmp.getId())) {
p.getMusicList().remove(deleteId);
flag = true;
break;
}
}
}
if(flag) {
System.out.println("删除成功!");
}else {
System.out.println("所有歌单中都不存在该歌曲!");
}
}
public void exportPlayList(PlayListCollection plc) {
System.out.println("请输入要导出歌单的播放列表名称:");
sc = new Scanner(System.in);
String playListName = sc.next();
boolean flag = false;
Set<String> set = plc.getPlayListMap().keySet();
for (String temp : set) {
if (playListName.equals(temp)) {
flag = true;
break;
}
}
if (flag) {
try {
FileOutputStream fos = new FileOutputStream(playListName + "的歌单");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(plc.getPlayListMap().get(playListName).musicList);
oos.flush();
oos.close();
fos.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
package com.imooc.player;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
public class PlayListCollection {
private Map<String, PlayList> playListMap = new HashMap<>();
private Scanner sc;
public PlayListCollection() {
}
public PlayListCollection(Map<String, PlayList> playListMap) {
this.setPlayListMap(playListMap);
}
public Map<String, PlayList> getPlayListMap() {
return playListMap;
}
public void setPlayListMap(Map<String, PlayList> playListMap) {
this.playListMap = playListMap;
}
public void addPlayList() {
PlayList p = new PlayList();
System.out.println("请输入要添加的播放列表名称:");
sc = new Scanner(System.in);
String playListName = sc.next();
boolean flag = false;
Set<String> set = playListMap.keySet();
for (String temp : set) {
if (playListName.equals(temp)) {
flag = true;
break;
}
}
if (flag) {
System.out.println("播放列表名称重复,请重新输入!");
} else {
playListMap.put(playListName, p);
System.out.println("播放列表添加成功!");
}
}
public void deletePlayList() {
System.out.println("请输入要删除的播放列表名称:");
sc = new Scanner(System.in);
String playListName = sc.next();
boolean flag = false;
Set<String> set = playListMap.keySet();
for(String temp: set) {
if(playListName.equals(temp)) {
flag = true;
break;
}
}
if(flag) {
playListMap.remove(playListName);
System.out.println("播放列表删除成功!");
}else {
System.out.println("该播放列表不存在!");
}
}
public void searchPlayListByName() {
System.out.println("请输入要查询的播放列表名称:");
sc = new Scanner(System.in);
String s = sc.next();
boolean flag = false;
Set<String> set = playListMap.keySet();
for(String temp: set) {
if(s.equals(temp)) {
flag = true;
break;
}
}
if(flag) {
System.out.println("该播放列表存在!");
System.out.println("该播放列表的名称为:"+s);
System.out.println("播放列表中的所有歌曲为:");
for(Song temp: playListMap.get(s).getMusicList()) {
System.out.println(temp);
}
}else {
System.out.println("该播放列表不存在!");
}
}
public void displayPlayListName() {
Set<String> set = playListMap.keySet();
System.out.println("播放列表名称为:");
for(String temp: set) {
System.out.println(temp);
}
}
}
package com.imooc.player;
import java.util.InputMismatchException;
import java.util.Scanner;
public class TestDemo {
static Scanner sc;
public void mainMenu() {
System.out.println("*************************");
System.out.println("**主菜单**");
System.out.println("1--播放列表管理");
System.out.println("2--播放器管理");
System.out.println("0--退出");
System.out.println("*************************");
}
public void playListMenu() {
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("*************************");
}
public void playerMenu() {
System.out.println("*************************");
System.out.println("1--向播放器添加播放列表");
System.out.println("2--从播放器删除播放列表");
System.out.println("3--通过名字查询播放列表信息");
System.out.println("4--显示所有播放列表名称");
System.out.println("9--返回上一级菜单");
}
public static void main(String[] args) {
TestDemo td = new TestDemo();
PlayList pl = new PlayList();
PlayListCollection plc = new PlayListCollection();
PlayList mainPl = new PlayList();
plc.getPlayListMap().put("主播放列表", mainPl);
int n = 0;
int n1 = 0;
int n2 = 0;
boolean flag = true;
boolean flag1 = false;
boolean flag2 = false;
while (flag) {
td.mainMenu();
System.out.println("请输入对应的数字进行操作:");
while (true) {
try {
sc = new Scanner(System.in);
n = sc.nextInt();
break;
} catch (InputMismatchException e) {
System.out.println("错误!请输入数字");
}
}
switch (n) {
case 1:
flag = false;
flag1 = true;
while (flag1) {
td.playListMenu();
System.out.println("请输入对应的数字对播放列表进行管理:");
while (true) {
try {
sc = new Scanner(System.in);
n1 = sc.nextInt();
break;
} catch (InputMismatchException e) {
System.out.println("错误!请输入数据");
}
}
switch (n1) {
case 1:
pl.addToMainPlayList(plc);
break;
case 2:
pl.addToPlayList(plc);
break;
case 3:
pl.searchSongById(plc);
break;
case 4:
pl.searchSongByName(plc);
break;
case 5:
pl.updateSong(plc);
break;
case 6:
pl.deleteSong(plc);
break;
case 7:
pl.displayAllSongs(plc);
break;
case 8:
pl.exportPlayList(plc);
break;
case 9:
flag1 = false;
flag = true;
break;
default:
System.out.println("请输入对应的数字!");
break;
}
}
break;
case 2:
flag = false;
flag2 = true;
while(flag2) {
td.playerMenu();
System.out.println("请输入对应的数字对播放器进行管理:");
while (true) {
try {
sc = new Scanner(System.in);
n2 = sc.nextInt();
break;
} catch (InputMismatchException e) {
System.out.println("错误!请输入数字");
}
}
switch(n2) {
case 1:
plc.addPlayList();
break;
case 2:
plc.deletePlayList();
break;
case 3:
plc.searchPlayListByName();
break;
case 4:
plc.displayPlayListName();
break;
case 9:
flag2 = false;
flag = true;
break;
default:
System.out.println("请输入对应的数字!");
break;
}
}
break;
case 0:
System.out.println("退出!");
System.exit(0);
}
}
}
}0
收起
正在回答
2回答
p1.getMusicList().remove(modifyId);这句代码在集合中使用,移除的应该是Song对象,不是String对象,因为没有找到匹配的数据,虽然没有报错但是没有执行成功删除操作(deleteSong()方法有相同的问题),当再次添加add()方法执行后,尤其id相同冲突导致异常,正常处理应该是p1.getMusicList().remove(tmp);执行完修改后应该使用break退出循环。另外代码逻辑过复杂,可参考我下面的提示做逻辑上的简化。
Java零基础入门18
- 参与学习 人
- 提交作业 7317 份
- 解答问题 14452 个
想要入门学编程?多年一直活跃在编程语言排行版前列的Java是一个很好的选择。本路径将从Java基础语法、面向对象、常用工具类三部分,为你开启软件开发的大门!
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星