急!基本功能都写差不多了,但是添加普通列表方法里面出现重复添加数据的问题,不知道怎么解决
import java.util.ArrayList; import java.util.List; import java.util.Scanner; //播放列表类 public class PlayList { private String playListName;//播放列表名称 private List<Song> musicList;//播放列表中的歌曲集合 //构造方法 public PlayList(){ musicList = new ArrayList<Song>(); } 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){ //添加主播放列表属性 this.setPlayListName("主播放列表"); //输入歌曲数量 Scanner sc = new Scanner(System.in); System.out.println("请输入要添加的歌曲数量:"); int songNum = sc.nextInt(); for(int i=1; i<=songNum; i++){ System.out.println("请输入第" + i + "首歌曲:"); System.out.println("请输入歌曲id:"); String id = sc.next(); System.out.println("请输入歌曲名称:"); String name = sc.next(); System.out.println("请输入演唱者:"); String singer = sc.next(); //将歌曲添加到主要播放列表中 musicList.add(new Song(id, name, singer)); } } //将歌曲添加到普通播放列表 public void addToOrdinaryPlayList(PlayListCollection playListCollection){ System.out.println("请输入要添加的播放列表名称:"); Scanner sc = new Scanner(System.in); String playListName = sc.next(); //创建一个集合,对歌曲信息进行保存 List<Song> listSong = new ArrayList<Song>(); //判断是否有该播放列表 if (playListCollection.getPlayListMap().containsKey(playListName)){ //有该播放列表 System.out.println("请输入要添加的歌曲数量:"); int songNum = sc.nextInt(); for(int i=1; i<=songNum; i++){ System.out.println("请输入第" + i + "首歌曲:"); System.out.println("请输入歌曲id:"); String id = sc.next(); //查找是否有相同的歌曲id boolean flag = false; for(int j=0; j<musicList.size(); j++){ //如果相同,就将该歌曲加入到列表中,并退出循环 if(musicList.get(j).getId().equals(id)){ //将歌曲信息添加到普通播放列表中 listSong.add(musicList.get(j)); for(int k=0; k<listSong.size(); k++){ System.out.println(listSong.get(k)); } flag = true; break; } } if(flag){ //有相同的歌曲id,则重新执行for循环 continue; }else{ //没有相同的歌曲id System.out.println("该歌曲在主播放列表中不存在,继续输入歌曲的其他信息!"); System.out.println("请输入歌曲名称:"); String name = sc.next(); System.out.println("请输入演唱者:"); String singer = sc.next(); //将歌曲信息添加到普通播放列表中 listSong.add(new Song(id, name, singer)); //将歌曲信息添加到主播放列表中 musicList.add(new Song(id, name, singer)); } } System.out.println("普通播放列表:"); //显示普通播放列表的歌曲 for(int i=0; i<listSong.size(); i++){ System.out.println(listSong.get(i)); } //将listSong的信息添加到普通播放列表中 for(int k=0; k<listSong.size(); k++){ playListCollection.getPlayListMap().get(playListName).musicList.add(listSong.get(k)); } for(int k=0; k<playListCollection.getPlayListMap().get(playListName).musicList.size(); k++){ System.out.println(playListCollection.getPlayListMap().get(playListName).musicList.get(k)); } // System.out.println("主播放列表:"); // //显示所有的歌曲(即为主播放列表歌曲) // for(int j=0; j<musicList.size(); j++){ // System.out.println(musicList.get(j)); // } // // System.out.println("普通播放列表:"); // //显示普通播放列表的歌曲 // for(int i=0; i<list.size(); i++){ // System.out.println(list.get(i)); // } }else{ System.out.println("该播放列表不存在,请先将播放列表添加到播放器中!"); } } //通过ID查询歌曲 public void searchSongById(PlayListCollection playListCollection){ Scanner sc = new Scanner(System.in); //请输入要查询播放列表名称 System.out.println("请输入要查询的播放列表名称:"); String playListName = sc.next(); //判断是否是主播放列表 if(playListName.equals("主播放列表")){ //有则输入歌曲ID,取出歌曲信息 System.out.println("请输入要查询的歌曲id:"); String songId_1 = sc.next(); for(int i=0; i<musicList.size(); i++){ //判断该播放列表里是否含有该歌曲id if(musicList.get(i).getId().equals(songId_1)){ System.out.println(musicList.get(i)); }else{ System.out.println("主播放列表没有该歌曲id!"); } } }else if(playListCollection.getPlayListMap().containsKey(playListName)){ //有则输入歌曲ID,取出歌曲信息 System.out.println("请输入要查询的歌曲id:"); String songId_2 = sc.next(); List<Song> list = playListCollection.getPlayListMap().get(playListName).getMusicList(); for(int i=0; i<list.size(); i++){ //判断该播放列表里是否含有该歌曲id if(list.get(i).getId().equals(songId_2)){ System.out.println(musicList.get(i)); }else{ System.out.println("该歌曲在播放列表:" + playListName + "不存在!"); break; } } }else{ System.out.println("该播放列表不存在,请先将播放列表添加到播放器中!"); } } //通过歌曲名称查询歌曲 public void searchSongByName(PlayListCollection playListCollection){ Scanner sc = new Scanner(System.in); //请输入要查询播放列表名称 System.out.println("请输入要查询的播放列表名称:"); String playListName = sc.next(); //判断是否是主播放列表 if(playListName.equals("主播放列表")){ //有则输入歌曲名字,取出歌曲信息 System.out.println("请输入要查询的歌曲名称:"); String songName_1 = sc.next(); for(int i=0; i<musicList.size(); i++){ //判断该播放列表里是否含有该歌曲名称 if(musicList.get(i).getName().equals(songName_1)){ System.out.println(musicList.get(i)); }else{ System.out.println("主播放列表没有该歌曲id!"); break; } } }else if(playListCollection.getPlayListMap().containsKey(playListName)){ //有则输入歌曲ID,取出歌曲信息 System.out.println("请输入要查询的歌曲名称:"); String songName_2 = sc.next(); List<Song> list = playListCollection.getPlayListMap().get(playListName).getMusicList(); for(int i=0; i<list.size(); i++){ //判断该播放列表里是否含有该歌曲名称 if(list.get(i).getName().equals(songName_2)){ System.out.println(musicList.get(i)); }else{ System.out.println("该歌曲在播放列表" + playListName + "不存在!"); break; } } }else{ System.out.println("该播放列表不存在,请先将播放列表添加到播放器中!"); } } //修改歌曲 public void updateSong(Song song){ Scanner sc = new Scanner(System.in); //输入修改歌曲id System.out.println("请输入要修改的歌曲id:"); String songId = sc.next(); for(int i=0; i<musicList.size(); i++){ //判断该播放列表里是否含有该歌曲id if(musicList.get(i).getId().equals(songId)){ System.out.println("请输入修改后的歌曲名称:"); String songName = sc.next(); System.out.println("请输入修改后的演唱者:"); String singerName = sc.next(); musicList.get(i).setName(songName); musicList.get(i).setSinger(singerName); System.out.println("修改成功!"); }else{ System.out.println("主播放列表没有该歌曲id!"); break; } } } //删除歌曲 public void deleteSong(){ Scanner sc = new Scanner(System.in); //输入删除的歌曲id System.out.println("请输入要删除的歌曲id:"); String songId = sc.next(); for(int i=0; i<musicList.size(); i++){ //判断该播放列表里是否含有该歌曲id if(musicList.get(i).getId().equals(songId)){ musicList.remove(i); System.out.println("删除歌曲" + musicList.get(i).getName() + "成功!"); } } } //显示播放列表中所有歌曲 public void displayAllSong(PlayListCollection playListCollection){ Scanner sc = new Scanner(System.in); //输入播放列表名称 System.out.println("请输入要显示的播放列表名称"); String playListName = sc.next(); if(playListName.equals("主播放列表")){ //显示所有的歌曲(即为主播放列表歌曲) for(int i=0; i<musicList.size(); i++){ System.out.println(musicList.get(i)); } }else if(playListCollection.getPlayListMap().containsKey(playListName)){ //显示普通播放列表的歌曲 List<Song> list = playListCollection.getPlayListMap().get(playListName).getMusicList(); for(int i=0; i<list.size(); i++){ System.out.println(list.get(i)); } }else{ System.out.println("该播放列表不存在,请先将播放列表添加到播放器中!"); } } //导出歌单 public void exportPlayList(){ } }
将歌曲添加到普通播放列表
请输入要添加的播放列表名称:
请输入要添加的歌曲数量:
2
请输入第1首歌曲:
请输入歌曲id:
s01
歌曲信息:id为s01, 歌曲名称为:1, 演唱者为:11
请输入第2首歌曲:
请输入歌曲id:
s03
该歌曲在主播放列表中不存在,继续输入歌曲的其他信息!
请输入歌曲名称:
3
请输入演唱者:
33
普通播放列表:
歌曲信息:id为s01, 歌曲名称为:1, 演唱者为:11
歌曲信息:id为s03, 歌曲名称为:3, 演唱者为:33
歌曲信息:id为s01, 歌曲名称为:1, 演唱者为:11
歌曲信息:id为s02, 歌曲名称为:2, 演唱者为:22
歌曲信息:id为s03, 歌曲名称为:3, 演唱者为:33
歌曲信息:id为s01, 歌曲名称为:1, 演唱者为:11
歌曲信息:id为s03, 歌曲名称为:3, 演唱者为:33
为什么会出现这个问题,song类里面写了hascode和equal方法
正在回答 回答被采纳积分+1
你好!首先代码的结构上有些问题,把本来应该写到主方法中的代码也写到了PlayList和PlayListCollection类中,导致了逻辑上的一些混乱。
比如PlayList类,这个类中有一个存储歌曲信息的集合musicList,而从代码中看到好像把它当成主播放列表使用了。而在下面的代码中,又去调用musicList,那么这时候的musicList中之前是否有主播放列表的歌曲呢?所以就会比较混乱了
//将listSong的信息添加到普通播放列表中 for(int k=0; k<listSong.size(); k++){ playListCollection.getPlayListMap().get(playListName).musicList.add(listSong.get(k)); }
正确的做法是,每个类都具有独立的功能,不要和业务混为一谈。比如PlayList类,里面就是对歌曲信息的增删改查,和主播放列表和任何一个普通播放列表都没关系。主播放列表和普通播放列表都是PlayList类的对象,都具有自己独立的musicList,用于存放歌曲。
哪些功能应该写到主方法中呢,比如添加歌曲到普通播放列表的代码,把输入播放列表名称,然后对播放列表名称进行查询的代码写到主方法中,只需要根据查询的返回值进行判断,如果不为null,表示找到了播放列表,那么就进行添加歌曲,否则给出错误提示。
按照这种思路把PlayList和PlayListCollection类都改一下。
祝学习愉快!
import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import java.util.Scanner; import java.util.Set; //播放器类 public class PlayListCollection { private Map<String, PlayList> playListMap ;//存放播放列表的集合 //构造方法 public PlayListCollection(){ playListMap = new HashMap<String, PlayList>(); } public PlayListCollection(Map<String, PlayList> playListMap) { this.playListMap = playListMap; } //getter 和 setter public Map<String, PlayList> getPlayListMap() { return playListMap; } public void setPlayListMap(Map<String, PlayList> playListMap) { this.playListMap = playListMap; } //添加播放列表 public void addPlayList(PlayList playList){ while(true){ System.out.println("输入要添加播放列表的名称:"); //输入播放列表的名称 Scanner sc = new Scanner(System.in); String playListName = sc.nextLine(); playList.setPlayListName(playListName); //判断播放列表是否存在 if(playListMap.containsKey(playListName)){ System.out.println("该播放列表名称已经存在,请重新输入!"); continue; }else{ playListMap.put(playListName, playList); break; } } } //删除播放列表 public void deletePlayList(PlayList playList){ System.out.println("输入要删除的播放列表的名称:"); //输入播放列表的名称 Scanner sc = new Scanner(System.in); String playListName = sc.next(); //判断列表是否存在 if(playListMap.containsKey(playListName)){ playListMap.remove(playListName); System.out.println(playListName + "列表已经被删除"); }else{ System.out.println("没有该列表!"); } } //通过名字查询 public PlayList searchPlayListByName(){ System.out.println("请输入要查询的播放列表名称:"); //输入播放列表的名称 Scanner sc = new Scanner(System.in); String playListName = sc.next(); if(playListMap.containsKey(playListName)){ //列表存在,则输出列表名称和歌曲 System.out.println("该播放列表存在!"); System.out.println("该播放列表的名称为:" + playListName); System.out.println("播放列表中的所有歌曲为:"); //通过entrySet方法取得对应的Value Set<Entry<String, PlayList>> entrySet = playListMap.entrySet(); for(Entry<String, PlayList> entry:entrySet){ return entry.getValue(); } }else{ System.out.println("没有该播放列表!"); } return null; } //显示所有播放列表的名称 public void displayPlayListName(){ //通过entrySet方法输出playListMap System.out.println("播放列表名称为:"); Set<Entry<String, PlayList>> entrySet = playListMap.entrySet(); for(Entry<String, PlayList> entry:entrySet){ System.out.println(entry.getKey()); } } }
- 参与学习 人
- 提交作业 7317 份
- 解答问题 14452 个
想要入门学编程?多年一直活跃在编程语言排行版前列的Java是一个很好的选择。本路径将从Java基础语法、面向对象、常用工具类三部分,为你开启软件开发的大门!
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星