老师,我的代码中无法删除歌曲信息,修改歌曲信息时出现异常,请老师帮忙解决一下,谢谢!

老师,我的代码中无法删除歌曲信息,修改歌曲信息时出现异常,请老师帮忙解决一下,谢谢!

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);
			}
		}
	}
}

正在回答

登陆购买课程后可参与讨论,去登陆

2回答

p1.getMusicList().remove(modifyId);这句代码在集合中使用,移除的应该是Song对象,不是String对象,因为没有找到匹配的数据,虽然没有报错但是没有执行成功删除操作(deleteSong()方法有相同的问题),当再次添加add()方法执行后,尤其id相同冲突导致异常,正常处理应该是p1.getMusicList().remove(tmp);执行完修改后应该使用break退出循环。另外代码逻辑过复杂,可参考我下面的提示做逻辑上的简化。

irista23 2018-12-23 12:28:59

updateSong( Song song) 按照题目要求传入的应该是Song类型的参数,方法体里可以直接调用searchSongById()返回的Song对象,直接使用集合的remove()方法传入实现删除操作,再调用add()进行添加,注意remove()传入的是搜索到的Song对象。

deleteSong(String id)按照题目要求传入的应该是id, 最简便处理也是先调用searchSongById(),返回的Song对象,传入集合的remove()方法实现删除。


  • 提问者 慕运维4141298 #1
    老师,请问您知道我的这两部分的代码具体的错误原因吗?我的想法是修改和删除所有播放列表中的歌曲
    2018-12-23 17:05:25
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师