问题一大堆
一大堆问题,我都有点不好意思了
问题1:添加普通播放列表后,再查询,如果该播放列表没有歌曲,报错
问题2:将歌曲添加到主播放列表,无法识别ID,我曾试过输入ID后遍历的方法,同问题1一样,没歌报错,实在没办法就把判断方法给删了
问题3:如果添加普通播放列表后,直接去播放列表管理,选2添加普通播放列表的歌曲,同问题1一样,没歌报错
问题4:全局修改歌曲,for循环几次,提示输入修改后的歌曲名和演奏者就提示几次,无法做到老师那样只提示1次
问题5:全局删除歌曲.删除成功的提示无法做出只提示1次,目前只能做到要么提示多次,要么不提示
问题6导出歌单,虽然可以成功导出,但不知道怎么自定义歌单名,而且还会报错
问题7:代码太臃肿,怎么能优化一下?
TestDemo中本来有很多注释,但提示我不能超过8000字就全被我删了
正在回答
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类中写几个方法,把相关操作抽取出来。
代码整体写的还不错,能把功能基本上实现了。祝学习愉快!
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; } } } }
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); } } }
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(); } } }
- 参与学习 人
- 提交作业 5461 份
- 解答问题 7235 个
此次推出的专题为Android攻城狮培养计划的第一部分语法与界面基础篇,将带大家从0开始学习Android开发。
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星