老师帮忙看下代码有什么问题,还有播放列表我使用了Set集合,Set和List集合有什么区别?
来源:4-7 自由编程
qq_酒半熏_0
2020-02-15 11:00:06
package com.jiubx.player; import java.io.Serializable; //歌曲类 public class Song implements Serializable{ private String id;//id private String name;//歌曲名称 private String singer;//演唱者 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; } //重写hashCode()方法,不改变格式 @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; } //重写equals()方法,比较两对象的属性是否全部相等 @Override public boolean equals(Object obj) { if(this==obj) return true; if(obj.getClass()==Song.class) { Song song=(Song)obj; return (song.getId().equals(id))&&(song.getName().equals(name))&&(song.getSinger().equals(singer)); //return (song.getId()==id)&&(song.getName()==name)&&(song.getSinger()==singer); } return false; } @Override public String toString() { return "歌曲id:" + id + ", 歌曲名称:" + name + ", 演唱者:" + singer ; } }
package com.jiubx.player; import java.io.Serializable; import java.util.HashSet; import java.util.Iterator; import java.util.Scanner; import java.util.Set; //播放列表类 public class PlayList implements Serializable{ private String playListName;//播放列表名称 private Set<Song> songSet=null;//存放song对象的set集合 Iterator<Song> it;//在迭代器中存放songSet集合中所有元素 public PlayList(String playListName) { this.setPlayListName(playListName); songSet=new HashSet<Song>();//实例化set接口的实现类的对象 } public String getPlayListName() { return playListName; } public void setPlayListName(String playListName) { this.playListName = playListName; } //向播放列表中添加song对象 public void addToPlayList(Song song) { boolean flag=false;//判断该歌曲是否在播放列表中存在 for(Song s:songSet) { //System.out.println(s.equals(song)); if(s.equals(song)) { flag=true; System.out.println("该歌曲在播放列表中已存在,添加歌曲失败!"); } } if(!flag) { songSet.add(song); System.out.println("向播放列表中添加歌曲"+song.getId()+"成功!"); } } //删除播放列表中的歌曲 public void deleteSongInPlayList(String id) { boolean flag=false;//判断播放列表中是否有此歌曲 //如果播放列表中没有song对象(歌曲)则结束方法 if(songSet.isEmpty()) { System.out.println("播放列表为空,无法删除歌曲!"); return; } //使用增强型for循环遍历set集合,将集合中的元素与id进行比较 for(Song song:songSet) { if(song.getId().equals(id)) { songSet.remove(song); System.out.println("删除歌曲id\""+id+"\"成功"); flag=true; break; //不用break避免可能有重复id,但会出现并发异常,用break只会删除重复id歌曲中先查询到的第一首歌曲 } } if(!flag) { System.out.println("播放列表中没有此歌曲id,删除歌曲id\""+id+"\"失败!"); } } //修改播放列表中的歌曲 public void updateSongInPlayList(String id,Song song) { boolean flag=false;//判断播放列表中是否有此歌曲 //如果播放列表中没有song对象(歌曲)则结束方法 if(songSet.isEmpty()) { System.out.println("播放列表为空,无法修改歌曲!"); return; } //使用增强型for循环遍历set集合,将集合中的元素与id进行比较 for(Song song1:songSet) { if(song1.getId().equals(id)) { Scanner sc=new Scanner(System.in); songSet.remove(song1);//删除要修改的歌曲 addToPlayList(song); System.out.println("修改歌曲id\""+id+"\"成功"); flag=true; break; //不用break避免可能有重复id,不用会出现并发异常,用break只会修改重复id歌曲中先搜索到的歌曲 } } if(!flag) { System.out.println("播放列表中没有此歌曲id,修改歌曲id\""+id+"\"失败!"); } } //通过歌曲id查询播放列表中的歌曲 public void searchSongInPlayListById(String id) { boolean flag=false;//判断播放列表中是否有此歌曲 //如果播放列表中没有song对象(歌曲)则结束方法 if(songSet.isEmpty()) { System.out.println("播放列表为空,无法查询歌曲!"); return; } //使用增强型for循环遍历set集合,将集合中的元素与id进行比较 for(Song song:songSet) { if(song.getId().equals(id)) { System.out.println("查询歌曲id\""+id+"\"成功,歌曲的信息是:"); System.out.println(song); flag=true; //break; //不用break避免可能有重复id } } if(!flag) { System.out.println("播放列表中没有此歌曲id,查询歌曲id\""+id+"\"失败!"); } } //通过歌曲名称查询播放列表中的歌曲 public void searchSongInPlayListByName(String name) { boolean flag=false;//判断播放列表中是否有此歌曲 //如果播放列表中没有song对象(歌曲)则结束方法 if(songSet.isEmpty()) { System.out.println("播放列表为空,无法查询歌曲!"); return; } //使用增强型for循环遍历set集合,将集合中的元素与id进行比较 for(Song song:songSet) { if(song.getName().equals(name)) { System.out.println("查询歌曲名称\""+name+"\"成功,歌曲的信息是:"); System.out.println(song); flag=true; //break; //不用break避免可能有重复name } } if(!flag) { System.out.println("播放列表中没有此歌曲名称,查询歌曲名称\""+name+"\"失败!"); } } //显示播放列表中所有歌曲 public void showAllSong() { if(songSet.isEmpty()) { System.out.println("播放列表为空!"); } for(Song song:songSet) { System.out.println(song); } } public Set<Song> getSongSet() { return songSet; } public void setSongSet(Set<Song> songSet) { this.songSet = songSet; } } package com.jiubx.player; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import java.util.Set; //播放器类 public class PlayListCollection { private Map<String,PlayList> playlistMap; Set<String> keySet; public PlayListCollection() { playlistMap=new HashMap<String,PlayList>(); } //向播放器中添加播放列表 public void addPlayListToMap(PlayList playlist) { playlistMap.put(playlist.getPlayListName(), playlist); } //从播放器删除播放列表 public void deletePlayListInMap(PlayList playlist) { boolean flag=false;//判断播放器中是否有此播放列表 keySet=playlistMap.keySet(); //增强型for遍历Set集合中元素,并将之与要删除的播放列表对比 for(String s:keySet) { if(s.equals(playlist.getPlayListName())) { playlistMap.remove(s); System.out.println("删除播放列表\""+s+"\"成功!"); flag=true; break; } } if(!flag) { System.out.println("播放器中没有播放列表"+playlist.getPlayListName()); } } //通过名字查询播放列表信息 public PlayList searchPlayListInMapByName(String playListName) { keySet=playlistMap.keySet(); //增强型for遍历Set集合中元素,并将之与要查询的播放列表对比 for(String s:keySet) { if(s.equals(playListName)) { //playlistMap.get(s).showAllSong(); return playlistMap.get(s); } } return null; } //显示所有播放列表名称 public void showPlayListNameInMap() { Set<Entry<String,PlayList>> set=playlistMap.entrySet(); for(Entry<String,PlayList> entry:set) { System.out.println(entry.getKey()); } } public Map<String, PlayList> getPlaylistMap() { return playlistMap; } public void setPlaylistMap(Map<String, PlayList> playlistMap) { this.playlistMap = playlistMap; } } package com.jiubx.player; 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.HashSet; import java.util.InputMismatchException; import java.util.Iterator; import java.util.List; import java.util.Map.Entry; import java.util.Scanner; import java.util.Set; //播放器测试类 public class PlayerTest { // 测试Song类 public void songTest() { Song song1 = new Song("s001", "左手指月", "萨顶顶"); Song song2 = new Song("s002", "阿刁", "赵雷"); Song song3 = new Song("s003", "黑暗骑士", "林俊杰"); Song song4 = new Song("s003", "黑暗骑士", "林俊杰"); Set<Song> ss = new HashSet<>(); ss.add(song1); ss.add(song2); ss.add(song3); for (Song s : ss) { System.out.println(s.equals(song4)); } } // 测试PlayList类 public void playListTest() { Song song1 = new Song("s001", "左手指月", "萨顶顶"); Song song2 = new Song("s002", "阿刁", "赵雷"); Song song3 = new Song("s003", "黑暗骑士", "林俊杰"); Song song4 = new Song("s003", "黑暗骑士", "林俊杰"); PlayList playlist = new PlayList("主播放列表"); playlist.addToPlayList(song1); playlist.addToPlayList(song2); playlist.addToPlayList(song3); playlist.addToPlayList(song4); System.out.println("删除前播放列表中的歌曲:"); playlist.showAllSong(); playlist.deleteSongInPlayList("s001"); System.out.println("删除后播放列表中的歌曲:"); playlist.showAllSong(); System.out.println("通过id查询歌曲:"); playlist.searchSongInPlayListById("s003"); playlist.searchSongInPlayListById("s004"); playlist.searchSongInPlayListByName("阿刁"); } // 测试PlayListCollection类 public void playListCollectionTest() { PlayList mainPlayList = new PlayList("主播放列表"); mainPlayList.addToPlayList(new Song("s001", "左手指月", "萨顶顶")); mainPlayList.showAllSong(); PlayListCollection plc = new PlayListCollection(); plc.addPlayListToMap(mainPlayList); plc.showPlayListNameInMap(); plc.searchPlayListInMapByName("主播放列表"); } // 主菜单 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(" **播放列表管理** "); 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(" **播放器管理** "); System.out.println(" 1--向播放器添加播放列表 "); System.out.println(" 2--从播放器删除播放列表 "); System.out.println(" 3--通过名字查询播放列表信息 "); System.out.println(" 4--显示所有播放列表名称 "); System.out.println(" 9--返回上一级菜单 "); System.out.println("*********************************************"); } public static void main(String[] args) { PlayerTest pt = new PlayerTest(); Scanner sc = new Scanner(System.in); int input1, input2, input3; PlayList mainPlaylist = new PlayList("主播放列表");// 实例化主播放列表 PlayListCollection plc = new PlayListCollection();// 实例化播放器 plc.addPlayListToMap(mainPlaylist); // 默认将主播放列表添加到播放器中 PlayList favouritePlayList;// 声明普通播放列表的引用变量 boolean flag;// 判断播放器中是否存在此播放列表标志 String playlistName;// 播放列表名称 Set<String> keySet;// 将播放器中的所有播放列表名存入Set集合 pt.songTest(); // pt.playListTest(); // pt.playListCollectionTest(); while (true) { pt.mainMenu(); // 显示主菜单 boolean playlistFlag = true;// 播放列表管理循环控制标志 boolean playerFlag = true;// 播放器管理循环控制标志 try { System.out.println("请输入需要进行的操作所对应的数字:"); input1 = sc.nextInt(); } catch (InputMismatchException e) { sc.next(); // 将输入错误的数据读取出来 System.out.println("输入的数据格式有误!请输入数字。"); continue; } switch (input1) { case 1:// 显示播放列表菜单 while (playlistFlag) { pt.playlistMenu(); while (true) { try { System.out.println("请输入需要进行的操作所对应的数字:"); input2 = sc.nextInt(); break; } catch (InputMismatchException e) { sc.next(); // 将输入错误的数据读取出来 System.out.println("输入的数据格式有误!请输入数字。"); continue; } } switch (input2) { case 1: // 将歌曲添加到主播放列表 System.out.println("请输入添加的歌曲数目:"); int count; while (true) { try { count = sc.nextInt(); if (count < 1) { System.out.println("添加歌曲的数目无意义!"); break; } break; } catch (InputMismatchException e) { sc.next(); // 将输入错误的数据读取出来 System.out.println("输入的数据格式有误!请输入数字。"); continue; } } for (int n = 1; n <= count; n++) { System.out.println("请输入第" + n + "首歌曲的id:"); String strId = sc.next(); boolean idFlag = false;// 判断主播放列表是否存在相同id for (Song song1 : mainPlaylist.getSongSet()) { if (song1.getId().equals(strId)) { idFlag = true; break; } } if (idFlag) { System.out.println("该歌曲id在主播放列表中已存在,请输入其他歌曲id!"); n--; continue; } System.out.println("请输入第" + n + "首歌曲的名称:"); String strName = sc.next(); System.out.println("请输入第" + n + "首歌曲的演唱者:"); String strSinger = sc.next(); Song song = new Song(strId, strName, strSinger); mainPlaylist.addToPlayList(song);// 向主菜单中添加歌曲 } break; case 2:// 将歌曲添加到普通播放列表 flag = false;// 判断播放器中是否存在此播放列表标志 System.out.println("请输入要添加歌曲的普通播放列表名称:"); playlistName = sc.next(); if (playlistName.equals(mainPlaylist.getPlayListName())) { System.out.println("添加失败,请输入要添加歌曲的普通播放列表名称,不能输入主播放列表名称!"); break; } keySet = plc.getPlaylistMap().keySet();// 将播放器中的所有播放列表名存入Set集合 for (String s : keySet) { // 遍历Set集合 if (s.equals(playlistName)) { // 判断播放器中是否存在此播放列表 flag = true; System.out.println("请输入添加的歌曲数目:"); int count2; while (true) { try { count2 = sc.nextInt(); if (count2 < 1) { System.out.println("添加歌曲的数目无意义!"); break; } break; } catch (InputMismatchException e) { sc.next(); // 将输入错误的数据读取出来 System.out.println("输入的数据格式有误!请输入数字。"); continue; } } for (int n = 1; n <= count2; n++) { System.out.println("请输入第" + n + "首歌曲的id:"); String strId = sc.next(); boolean idFlag = false;// 判断主播放列表是否存在相同id for (Song song1 : mainPlaylist.getSongSet()) { if (song1.getId().equals(strId)) { idFlag = true; break; } } if (idFlag) { System.out.println("该歌曲id在主播放列表中已存在,请输入其他歌曲id!"); n--; continue; } System.out.println("请输入第" + n + "首歌曲的名称:"); String strName = sc.next(); System.out.println("请输入第" + n + "首歌曲的演唱者:"); String strSinger = sc.next(); Song song = new Song(strId, strName, strSinger); // 将要添加的歌曲与主播放列表中歌曲比较 boolean flag2 = false;// 将要添加的歌曲与主播放列表中歌曲比较的标志 for (Song song1 : mainPlaylist.getSongSet()) { if (song1.equals(song)) { plc.getPlaylistMap().get(s).addToPlayList(song1);// 若存在主播放列表中,直接使用 flag2 = true; break; } } if (!flag2) { // 若不存在主播放列表中,则在主播放列表和此普通播放列表都添加此歌曲 mainPlaylist.addToPlayList(song); plc.getPlaylistMap().get(s).addToPlayList(song); } } break; } } if (!flag) { System.out.println("播放器中不存在此播放列表,添加歌曲失败!"); } break; case 3:// 通过歌曲id查询播放列表中的歌曲 flag = false;// 判断播放器中是否存在此播放列表标志 System.out.println("请输入要查询的歌曲id的所在的播放列表名称:"); playlistName = sc.next(); keySet = plc.getPlaylistMap().keySet();// 将播放器中的所有播放列表名存入Set集合 for (String s : keySet) { // 遍历Set集合 if (s.equals(playlistName)) { // 判断播放器中是否存在此播放列表 flag = true; System.out.println("此播放列表存在,请输入要查询的歌曲id:"); String strId = sc.next(); plc.getPlaylistMap().get(s).searchSongInPlayListById(strId); break; } } if (!flag) { System.out.println("播放器中不存在此播放列表,根据歌曲id查询歌曲失败!"); } break; case 4:// 通过歌曲名称查询播放列表中的歌曲 flag = false;// 判断播放器中是否存在此播放列表标志 System.out.println("请输入要查询的歌曲名称的所在的播放列表名称:"); playlistName = sc.next(); keySet = plc.getPlaylistMap().keySet();// 将播放器中的所有播放列表名存入Set集合 for (String s : keySet) { // 遍历Set集合 if (s.equals(playlistName)) { // 判断播放器中是否存在此播放列表 flag = true; System.out.println("此播放列表存在,请输入要查询的歌曲名称:"); String strName = sc.next(); plc.getPlaylistMap().get(s).searchSongInPlayListByName(strName); break; } } if (!flag) { System.out.println("播放器中不存在此播放列表,根据歌曲名称查询歌曲失败!"); } break; case 5:// 修改播放列表中的歌曲 flag = false;// 判断播放器中是否存在此播放列表标志 System.out.println("请输入要修改歌曲的播放列表名称:"); playlistName = sc.next(); keySet = plc.getPlaylistMap().keySet();// 将播放器中的所有播放列表名存入Set集合 for (String s : keySet) { // 遍历Set集合 if (s.equals(playlistName)) { // 判断播放器中是否存在此播放列表 flag = true; System.out.println("此播放列表存在,请输入要修改的歌曲id:"); String songId = sc.next(); System.out.println("请输入修改歌曲的名称:"); String strName = sc.next(); System.out.println("请输入修改歌曲的演唱者:"); String strSinger = sc.next(); Song song = new Song(songId, strName, strSinger); mainPlaylist.updateSongInPlayList(songId, song);// 同时修改主播放列表中此歌曲 plc.getPlaylistMap().get(s).updateSongInPlayList(songId, song); break; } } if (!flag) { System.out.println("播放器中不存在此播放列表,修改播放列表中的歌曲失败!"); } break; case 6:// 删除播放列表中的歌曲 flag = false;// 判断播放器中是否存在此播放列表标志 System.out.println("请输入要删除歌曲的播放列表名称:"); playlistName = sc.next(); keySet = plc.getPlaylistMap().keySet();// 将播放器中的所有播放列表名存入Set集合 for (String s : keySet) { // 遍历Set集合 if (s.equals(playlistName)) { // 判断播放器中是否存在此播放列表 flag = true; System.out.println("此播放列表存在,请输入要删除的歌曲id:"); String strId = sc.next(); keySet = plc.getPlaylistMap().keySet(); for (String pl : keySet) { plc.getPlaylistMap().get(pl).deleteSongInPlayList(strId);// 删除所有播放列表中的此歌曲 } break; } } if (!flag) { System.out.println("播放器中不存在此播放列表,删除播放列表中的歌曲失败!"); } break; case 7:// 显示播放列表中的所有歌曲 System.out.println("请输入要显示歌曲的播放列表名称:"); playlistName = sc.next(); if (plc.searchPlayListInMapByName(playlistName) != null) { System.out.println("查询播放列表\"" + playlistName + "\"成功!播放列表的信息是:"); plc.getPlaylistMap().get(playlistName).showAllSong(); } else { System.out.println("该播放列表不存在!"); } // Set<Entry<String, PlayList>> entrySet = plc.getPlaylistMap().entrySet(); // System.out.println("显示播放器中所有播放列表的信息:"); // for (Entry<String, PlayList> eSet : entrySet) { // System.out.println(eSet.getKey() + ":"); // eSet.getValue().showAllSong(); // } break; case 8:// 导出歌单 flag = false;// 判断播放器中是否存在此播放列表标志 System.out.println("请输入要导出的歌单的播放列表名称:"); playlistName = sc.next(); keySet = plc.getPlaylistMap().keySet();// 将播放器中的所有播放列表名存入Set集合 for (String s : keySet) { // 遍历Set集合 if (s.equals(playlistName)) { // 判断播放器中是否存在此播放列表 flag = true; try { FileOutputStream fos = new FileOutputStream(playlistName + ".txt"); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(plc.getPlaylistMap().get(playlistName));// 歌单名称将歌单信息导出为“名称.txt”文件到项目的根目录下 FileInputStream fis = new FileInputStream(playlistName + ".txt"); ObjectInputStream ois = new ObjectInputStream(fis); try { ((PlayList) ois.readObject()).showAllSong();// 对象反序列化,同时显示歌曲信息。 } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } ois.close(); fis.close(); oos.flush(); fos.close(); oos.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } break; } } if (!flag) { System.out.println("播放器中不存在此播放列表,导出歌单失败!"); } break; case 9:// 返回上一级菜单 playlistFlag = false; break; default: System.out.println("输入数字有误,请重新输入!"); break; } } break; case 2:// 显示播放器菜单 while (playerFlag) { pt.playerMenu(); while (true) { try { System.out.println("请输入需要进行的操作所对应的数字:"); input3 = sc.nextInt(); break; } catch (InputMismatchException e) { sc.next(); // 将输入错误的数据读取出来 System.out.println("输入的数据格式有误!请输入数字。"); continue; } } switch (input3) { case 1:// 向播放器添加播放列表 System.out.println("请输入要添加的播放列表名称:"); playlistName = sc.next(); favouritePlayList = new PlayList(playlistName); plc.addPlayListToMap(favouritePlayList);// 向播放器中添加播放列表 break; case 2:// 从播放器删除播放列表 System.out.println("请输入要删除的播放列表名称:"); playlistName = sc.next(); if (playlistName.equals(mainPlaylist.getPlayListName())) { System.out.println("主播放列表不能删除!"); break; // 不能删除主播放列表,结束case语句 } if (plc.searchPlayListInMapByName(playlistName) != null) { plc.deletePlayListInMap(plc.getPlaylistMap().get(playlistName)); } else { System.out.println("该播放列表不存在!"); } break; case 3:// 通过名字查询播放列表信息 System.out.println("请输入要通过名字查询的播放列表名称:"); playlistName = sc.next(); if (plc.searchPlayListInMapByName(playlistName) != null) { System.out.println("查询播放列表\"" + playlistName + "\"成功!播放列表的信息是:"); plc.getPlaylistMap().get(playlistName).showAllSong(); } else { System.out.println("该播放列表不存在!"); } break; case 4:// 显示所有播放列表名称 keySet = plc.getPlaylistMap().keySet(); System.out.println("播放器中所有播放列表的名称:"); for (String s : keySet) { System.out.println(s); } break; case 9:// 返回上一级菜单 playerFlag = false; break; default: System.out.println("输入数字有误,请重新输入!"); break; } } break; case 0:// 退出 return;// 结束程序 } } } }
1回答
同学你好,测试代码是正确的的。但还有一个小建议如下:
1、主菜单
1) 输入不存在的数字,判断是否提示没有对应的操作,如果没有,增加default用来输出提示,如:
2、Set和List集合有什么区别?
1)List是元素有序并且可以重复的集合,List可以精确的控制每个元素的插入位置,或删除某个位置的元素
2)Set是元素无序并且不可以重复的集合
对此更详细的区别同学可参考教辅《集合》
http://file.mukewang.com/class/assist/35/217186/%E9%9B%86%E5%90%88.pdf
如果我的回答解决了你的疑惑,请采纳,祝学习愉快~
相似问题
回答 2
回答 3