急!基本功能都写差不多了,但是添加普通列表方法里面出现重复添加数据的问题,不知道怎么解决
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 星