问题一大堆

问题一大堆

一大堆问题,我都有点不好意思了

问题1:添加普通播放列表后,再查询,如果该播放列表没有歌曲,报错

问题2:将歌曲添加到主播放列表,无法识别ID,我曾试过输入ID后遍历的方法,同问题1一样,没歌报错,实在没办法就把判断方法给删了

问题3:如果添加普通播放列表后,直接去播放列表管理,选2添加普通播放列表的歌曲,同问题1一样,没歌报错

问题4:全局修改歌曲,for循环几次,提示输入修改后的歌曲名和演奏者就提示几次,无法做到老师那样只提示1次

问题5:全局删除歌曲.删除成功的提示无法做出只提示1次,目前只能做到要么提示多次,要么不提示

问题6导出歌单,虽然可以成功导出,但不知道怎么自定义歌单名,而且还会报错

问题7:代码太臃肿,怎么能优化一下?

TestDemo中本来有很多注释,但提示我不能超过8000字就全被我删了

正在回答

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

4回答

1、首先,你在PlayList的无参构造方法中,没有对ArrayList进行对象创建,而是在添加歌曲的时候才创建的对象,所以这就导致只要没有歌曲就会报错。因此,在无参构造方法中添加一句话musicList=new ArrayList<Song>();就可以了。

2、修改歌曲时,不要将输入数据的代码写到循环里,可以一开始的时候就输入要修改的歌曲id、名称、演唱者,然后创建一个Song类的对象。定义一个整型变量count用于统计是否有符合条件的歌曲被修改。循环遍历PlayListCollection,从中取出每一个播放列表,然后判断Song类的对象是否存在,如果存在则调用updateSong方法进行修改(建议定义的updateSong方法参数是一个Song类的对象),并将count的值加1。在循环外判断count值不为0则提示修改成功,否则提示所有的播放列表中均不存在该歌曲!

3、删除的操作和修改类似,如果想只提示一次,也可以定义一个统计变量

4、导出歌单的时候,播放列表的名称是你从键盘输入的,而不是固定的。输入播放列表名称后要查询该播放列表是否在PlayListCollection中存在,所以这些操作都是在case语句后面完成的。如果播放列表存在则调用exportPlayList()方法导出歌单,否则提示播放列表不存在。而在exportPlayList方法中用循环遍历musicList,得到歌曲,然后调用write()方法进行输出。可以不读取。

5、代码如果想优化的话,就要再定义一个类,或者直接在TestDemo类中写几个方法,把相关操作抽取出来。

代码整体写的还不错,能把功能基本上实现了。祝学习愉快!


  • 吴跃民 提问者 #1
    修改歌曲有个问题,我按照这个修改歌曲的思路将updateSong(Song song)方法改的方法体只有一条musicList.add(song);,跟添加方法重复了,给我的感觉很诡异.,似乎这个方法都没必要存在了,因为其他的步骤都在TestDemo类中完成了,而这个方法的存在仅仅只有象征性的意义了..
    2017-05-27 15:03:39
  • 吴跃民 提问者 #2
    修改歌曲我已经想到办法了,我把updateSong(Song song)改成了updateSong(PlayListCollection plc),完美解决,这样case5里的代码一共只有4行,倍舒爽
    2017-05-27 17:31:21
提问者 吴跃民 2017-05-26 18:54:54
package com.imooc;

import java.util.HashMap;
import java.util.Map.Entry;
import java.util.Scanner;
import java.util.Set;

public class TestDemo {

	static PlayListCollection plc = new PlayListCollection();
	Scanner sc = new Scanner(System.in);

	public static void main(String[] args) {
		TestDemo td = new TestDemo();
		HashMap<String, PlayList> map = new HashMap<String, PlayList>();
		map.put("主播放列表", new PlayList());
		plc.setPlayListMap(map);
		td.test();
	}
	public void testSong() {
		Song s1 = new Song();
		s1.setId("s001");
		s1.setName("夜空中最亮的星");
		s1.setSinger("逃跑计划");
		System.out.println(s1);
		Song s2 = new Song("s002", "北京北京", "汪峰");
		System.out.println(s2);
	}
	public void testPlayList() {
		playListMenu();
		String id, musicName, singer, playListName;
		int num = sc.nextInt();
		boolean flag = true;
		while (flag) {
			switch (num) {
			case 1:
				System.out.println("将歌曲添加到主播放列表");
				System.out.println("请输入要添加的歌曲数量:");
				num = sc.nextInt();
				for (int i = 1; i <= num; i++) {
					System.out.println("请输入第" + i + "首歌曲:");
					System.out.println("请输入歌曲的id:");
					id = sc.next();
					System.out.println("请输入歌曲名称:");
					musicName = sc.next();
					System.out.println("请输入演唱者:");
					singer = sc.next();
					Song song = new Song(id,musicName,singer);
					plc.getPlayListMap().get("主播放列表").addToPlayList(song);
				}
				playListMenu();
				num = sc.nextInt();
				break;
			case 2:
				System.out.println("将歌曲添加到普通播放列表");
				System.out.println("请输入要添加的播放列表名称:");
				playListName = sc.next();
				if (plc.getPlayListMap().containsKey(playListName)) {
					System.out.println("请输入要添加的歌曲数量:");
					num = sc.nextInt();
					for (int i = 1; i <= num; i++) {
						System.out.println("请输入第" + i + "首歌曲:");
						System.out.println("请输入歌曲的id:");
						id = sc.next();
						Song song = plc.getPlayListMap().get("主播放列表").searchSongById(id);
						if(song !=null){
							plc.getPlayListMap().get(playListName).addToPlayList(song);
						}else{
							System.out.println("该歌曲在主播放列表不存在,继续输入歌曲的其他信息");
							System.out.println("请输入歌曲名称:");
							musicName = sc.next();
							System.out.println("请输入演唱者:");
							singer = sc.next();
							Song s = new Song(id, musicName, singer);
							plc.getPlayListMap().get(playListName).addToPlayList(s);
							plc.getPlayListMap().get("主播放列表").addToPlayList(s);
						}
					}
					
					Set<Entry<String, PlayList>> entrySet = plc.getPlayListMap().entrySet();
					for (Entry<String, PlayList> entry : entrySet) {
						String key = entry.getKey();
						if(key.equals("主播放列表")){
							System.out.println(key+":");
						}else{
							System.out.println("普通播放列表"+":");
						}
						System.out.println("播放列表中所有歌曲为:");
						for(int i=0;i<entry.getValue().getMusicList().size();i++){
							System.out.println(entry.getValue().getMusicList().get(i));
						}
					}
				} else {
					System.out.println("该播放列表不存在,请先将播放列表添加到播放器中!");
				}
				playListMenu();
				num = sc.nextInt();
				break;
			case 3:
				System.out.println("通过歌曲id查询播放列表中的歌曲");
				System.out.println("请输入要查询的播放列表名称:");
				playListName = sc.next();
				if (plc.getPlayListMap().containsKey(playListName)) {
					System.out.println("请输入要查询的歌曲id:");
					id = sc.next();
					Song song = plc.getPlayListMap().get(playListName).searchSongById(id);
					if (song != null) {
						System.out.println("该歌曲的信息为:");
						System.out.println(song);
					} else {
						System.out.println("该歌曲不存在");
					}
				} else {
					System.out.println("没有改播放列表,请先添加!");
				}
				playListMenu();
				num = sc.nextInt();
				break;
			case 4:
				System.out.println("通过歌曲名称查询播放列表中的歌曲");
				System.out.println("请输入要查询的播放列表名称:");
				playListName = sc.next();
				if (plc.getPlayListMap().containsKey(playListName)) {
					System.out.println("请输入要查询的歌曲名称:");
					musicName = sc.next();
					Song song = plc.getPlayListMap().get(playListName).searchSongByName(musicName);
					if (song != null) {
						System.out.println("该歌曲的信息为:");
						System.out.println(song);
					} else {
						System.out.println("该歌曲不存在");
					}
				} else {
					System.out.println("没有该播放列表,请先添加!");
				}
				playListMenu();
				num = sc.nextInt();
				break;
			case 5:
				System.out.println("修改播放列表中的歌曲");
				System.out.println("请输入要修改的歌曲id:");
				id = sc.next();
				Set<Entry<String, PlayList>>entrySet = plc.getPlayListMap().entrySet();
				for (Entry<String, PlayList> entry : entrySet) {
					if (entry.getValue().searchSongById(id) != null) {
						entry.getValue().updateSong(id);
					}
				}
				playListMenu();
				num = sc.nextInt();
				break;
			case 6:
				System.out.println("删除播放列表中的歌曲");
				System.out.println("请输入要删除的歌曲id:");
				id = sc.next();
				entrySet = plc.getPlayListMap().entrySet();
				for (Entry<String, PlayList> entry : entrySet) {
					entry.getValue().deleteSong(id);			
				}
				playListMenu();
				num = sc.nextInt();
				break;
			case 7:
				System.out.println("显示播放列表中所有歌曲");
				System.out.println("请输入要显示的播放列表名称:");
				musicName = sc.next();
				if (plc.getPlayListMap().containsKey(musicName)) {
					plc.getPlayListMap().get(musicName).displayAllSong();
				} else {
					System.out.println("您输入的播放列表不存在");
				}

				playListMenu();
				num = sc.nextInt();
				break;
			case 8:
				System.out.println("导出歌单");
				System.out.println("请输入要导出歌单的播放列表名称:");
				musicName = sc.next();
				if (plc.getPlayListMap().containsKey(musicName)) {
					try {
						plc.getPlayListMap().get(musicName).exportPlayList();
					} catch (Exception e) {
						//e.printStackTrace();
					}
				}else{
					System.out.println("请要导出歌单的播放列表不存在");
				}
				playListMenu();
				num = sc.nextInt();
				break;
			case 9:
				return;
			default:
				System.out.println("输入错误,请重新输入");
				playListMenu();
				num = sc.nextInt();
				break;
			}
		}

	}
	public void testPlayListCollection() {
		String playListName;
		playMenu();
		int num = sc.nextInt();
		boolean flag = true;
		while (flag) {
			switch (num) {
			case 1:
				plc.addPlayList(new PlayList());
				playMenu();
				num = sc.nextInt();
				break;
			case 2:
				plc.deletePlayList();
				playMenu();
				num = sc.nextInt();
				break;
			case 3:
				System.out.println("通过名字查询播放列表信息");
				System.out.println("输入要查询的播放列表名称:");
				playListName = sc.next();
				PlayList playList =plc.searchPlayList(playListName);
				if(playList!=null){
					playList.displayAllSong();
				}
				playMenu();
				num = sc.nextInt();
				break;
			case 4:
				plc.displayPlayListName();
				playMenu();
				num = sc.nextInt();
				break;
			case 9:
				return;
			default:
				System.out.println("输入错误,请重新输入");
				playMenu();
				num = sc.nextInt();
				break;
			}
		}
	}

	public void mainMenu() {
		String str = "        ";
		System.out.println("********************************");
		System.out.println(str + "**主菜单**");
		System.out.println(str + "1--播放列表管理");
		System.out.println(str + "2--播放器管理");
		System.out.println(str + "0--退出");
		System.out.println("********************************");
		System.out.println("请输入对应的数字进行操作:");
	}
	public void playListMenu() {
		String str = "    ";
		System.out.println("********************************");
		System.out.println(str + "**播放列表管理**");
		System.out.println(str + "1--将歌曲添加到主播放列表");
		System.out.println(str + "2--将歌曲添加到普通播放列表");
		System.out.println(str + "3--通过歌曲id查询播放列表中的歌曲");
		System.out.println(str + "4--通过歌曲名称查询播放列表中的歌曲");
		System.out.println(str + "5--修改播放列表中的歌曲");
		System.out.println(str + "6--删除播放列表中的歌曲");
		System.out.println(str + "7--显示播放列表中所有歌曲");
		System.out.println(str + "8--导出歌单");
		System.out.println(str + "9--返回上一级菜单");
		System.out.println("********************************");
		System.out.println("请输入对应的数字对播放列表进行管理:");
	}
	public void playMenu() {
		String str = "        ";
		System.out.println("********************************");
		System.out.println(str + "**播放器管理**");
		System.out.println(str + "1--向播放器添加播放列表");
		System.out.println(str + "2--从播放器删除播放列表");
		System.out.println(str + "3--通过名称查询播放列表信息");
		System.out.println(str + "4--显示所有播放列表名称");
		System.out.println(str + "9--返回上一级菜单");
		System.out.println("********************************");
		System.out.println("请输入对应的数字对播放器进行管理:");
	}
	public void test() {
		mainMenu();
		int num = sc.nextInt();
		boolean flag = true;
		while (flag) {
			switch (num) {
			case 1:// 播放列表管理
				testPlayList();
				mainMenu();
				num = sc.nextInt();
				break;
			case 2:// 播放器管理
				testPlayListCollection();
				mainMenu();
				num = sc.nextInt();
				break;
			case 0:
				flag = false;
				break;
			default:
				System.out.println("输入错误,请重新输入");
				mainMenu();
				num = sc.nextInt();
				break;
			}
		}
	}
}


提问者 吴跃民 2017-05-26 18:52:11
package com.imooc;

import java.util.HashMap;
import java.util.Map.Entry;
import java.util.Scanner;
import java.util.Set;

public class PlayListCollection {
	private HashMap<String, PlayList> playListMap;
	Scanner sc = new Scanner(System.in);
	public PlayListCollection() {
	}

	public PlayListCollection(HashMap<String, PlayList> playListMap) {
		this.setPlayListMap(playListMap);
	}

	public HashMap<String, PlayList> getPlayListMap() {
		return playListMap;
	}

	public void setPlayListMap(HashMap<String, PlayList> playListMap) {
		this.playListMap = playListMap;
	}

	/**
	 * 添加播放列表
	 */
	public void addPlayList(PlayList playList) {
		System.out.println("向播放器添加播放列表");
		System.out.println("输入要添加的播放列表名称:");
		String musicName = sc.next();
		if(!playListMap.containsKey(musicName)){
			playListMap.put(musicName, playList);
		}else{
			System.out.println("您输入的播放列表名称已存在:");
		}
	}

	/**
	 * 删除播放列表,方法中进行删除
	 */
	//该方法的参数因为不知道有什么用,所以给删除了
	public void deletePlayList() {
		System.out.println("从播放器删除播放列表");
		System.out.println("输入要删除的播放列表名称:");
		String playListName = sc.next();
		if (playListMap.containsKey(playListName)) {
			playListMap.remove(playListName);
			System.out.println("播放列表"+playListName+"删除成功");
		} else {
			System.out.println("要删除的播放列表不存在");
		}
	}

	/**
	 * 通过名字查询播放列表信息
	 */
	public PlayList searchPlayList(String playListName) {
		if(playListMap.containsKey(playListName)){
			System.out.println("该播放列表存在");
			System.out.println("该播放列表名称为:" + playListName);
			return playListMap.get(playListName);
		}else{
			System.out.println("要查询的播放列表不存在");
			return null;
		}
	}

	/**
	 * 显示所有播放列表名称
	 */
	public void displayPlayListName() {
		System.out.println("显示所有播放列表名称");
		System.out.println("播放列表名称为:");
		Set<Entry<String, PlayList>> entrySet =playListMap.entrySet();
		for(Entry<String, PlayList> entry :entrySet){
			String key = entry.getKey();
			System.out.println(key);
		}
	}
}


提问者 吴跃民 2017-05-26 18:51:39
package com.imooc;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.Scanner;

public class PlayList {

	private String playListName;// 播放列表名称
	private ArrayList<Song> musicList;// 播放列表中的歌曲集合
	Scanner sc = new Scanner(System.in);

	public PlayList() {
	}

	// 带参构造
	public PlayList(String playListName, ArrayList<Song> musicList) {
		this.setPlayListName(playListName);
		this.setMusicList(musicList);
	}

	public String getPlayListName() {
		return playListName;
	}

	public void setPlayListName(String playListName) {
		this.playListName = playListName;
	}

	public ArrayList<Song> getMusicList() {
		return musicList;
	}

	public void setMusicList(ArrayList<Song> musicList) {
		this.musicList = musicList;
	}

	/**
	 * 将歌曲添加到播放列表
	 */
	public void addToPlayList(Song song) {
		if (musicList == null) {
			this.setMusicList(new ArrayList<Song>());
			musicList.add(song);
		} else {
			musicList.add(song);
		}

	}

	/**
	 * 通过ID查询歌曲
	 */
	public Song searchSongById(String id) {
		for (int i = 0; i < musicList.size(); i++) {
			if (id.equals(musicList.get(i).getId())) {
				return musicList.get(i);
			}
		}
		return null;
	}

	/**
	 * 通过名称查询歌曲
	 */
	public Song searchSongByName(String name) {
		for (int i = 0; i < musicList.size(); i++) {
			if (name.equals(musicList.get(i).getName())) {
				return musicList.get(i);
			}
		}
		return null;
	}

	/**
	 * 修改歌曲
	 */
	public void updateSong(String id) {
		Song s = this.searchSongById(id);
		if(s!=null){
			//musicList.remove(song);
			System.out.println("请输入修改后的歌曲名称:");
			String name = sc.next();
			System.out.println("请输入修改后的演唱者:");
			String singer = sc.next();
			musicList.remove(s);
			Song song = new Song(id,name,singer);
			musicList.add(song);
		}else{
			System.out.println("该歌曲不存在");
		}
	}

	/**
	 * 从播放列表删除歌曲
	 */
	public void deleteSong(String id) {
		Song song = this.searchSongById(id);
		if(song!=null){
			musicList.remove(song);
		}
	}

	/**
	 * 显示播放列表中所有歌曲
	 */
	public void displayAllSong() {
		if (!musicList.isEmpty()) {
			System.out.println("播放列表中所有歌曲为:");
			for (int i=0;i<musicList.size();i++) {
				System.out.println(musicList.get(i));
			}
		} else {
			System.out.println("该播放列表中没有歌曲");
		}
	}

	/**
	 * 导出歌曲
	 */
	public void exportPlayList() throws ClassNotFoundException{
		try {
			FileInputStream fis = new FileInputStream("喜爱的歌.txt");
			ObjectInputStream ois = new ObjectInputStream(fis);
			FileOutputStream fos = new FileOutputStream("喜爱的歌.txt");
			ObjectOutputStream oos = new ObjectOutputStream(fos);
			oos.writeObject(musicList);
			oos.flush();
			try {
				ArrayList<Song> al = (ArrayList<Song>) ois.readObject(); 
				System.out.println(al);
			} catch (Exception e) {
				e.printStackTrace();
			}
			fis.close();
			ois.close();
			fos.close();
			oos.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}


问题已解决,确定采纳
还有疑问,暂不采纳

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

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

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

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