关于public void updateSong(Song song)的问题

关于public void updateSong(Song song)的问题

这个方法我不太清楚这样设计是要怎么用,因为有着疑惑的时候我翻了下问答区,发现有一个提问和我的疑惑挺像,链接:https://class.imooc.com/course/qadetail/83462

看了讲师irista23所回答的内容后,我秉着如下2个原则进行编码:

  1. 不在各个实体类中相关方法中使用输入流获取用户从键盘输入的数据

  2. 尽量将输出语句都写在了TestDemo类的相关方法中,实体类中的方法只关注逻辑实现

回到原来的问题上,我是遵循着主播放列表是全集,其他普通播放列表是主播放列表的子集这一逻辑来设计此程序的,那么就会有如下的特点:

  1. 主播放列表中添加的歌曲不会自动加到其他普通播放列表中

  2. 普通列表添加主播放列表中不存在的歌曲时,主播放列表也会添加该歌曲

也就是说,主播放列表和普通播放列表中相同的歌曲的对象的引用实际上是指向同一块内存区域的,这样一来,在修改歌曲的时候,根据输入的歌曲id找到该对象,该对象再调用set方法,即可完成该id的歌曲在主播放列表以及其他含有此歌曲的普通播放列表中完成名字和演唱者信息的更改,这块我跑代码的时候验证过了确实可行,下面我将贴出添加歌曲到主方法和将歌曲添加到普通列表以及修改歌曲的部分代码。

/*
 * TestDemo类
 * mainPlayList:全局静态变量,主播放列表对象,在test()方法开始初始化
 * playListCollection:全局静态变量,播放器对象,在test()方法开始初始化
 */

//添加歌曲到主播放列表
case 1:{
				//1--将歌曲添加到主播放列表
				System.out.println("将歌曲添加到主播放列表");
				//1.提示输入添加的歌曲数量并校验
				int musicNum = 0;
				do {
					System.out.println("请输入要添加的歌曲的数量(输入0则返回菜单):");
					try {
						musicNum = console.nextInt();
						if(musicNum == 0) //如输入添加歌曲的数量为0,则认为不进行添加
							return ;
						else 
							break;//若输入正确(大于0的整数),跳出循环
					} catch (InputMismatchException e) {
						System.out.println("请输入不小于0的整数!");
						console.next();
					}
				}while(true);
				
				//进入循环
				for(int i = 0; i < musicNum; i++) {
					System.out.println("请输入第"+(i+1)+"首歌曲:");
					
					String songId = "";//歌曲id
					boolean isIdExists = false;//歌曲id是否已存在,true:已存在;false:不存在
					do {
						//2.提示输入歌曲id并校验是否已存在
						System.out.println("请输入歌曲的id:");
						songId = console.next();
						Song findSong = mainPlayList.searchSongById(songId);
						if(findSong != null) {
							if("exit()".equals(songId.toLowerCase())) {
								return ;//提供结束循环返回菜单的条件
							}
							System.out.println("此歌曲id已存在!" + findSong);//提示信息并输出歌曲信息
							System.out.println("若放弃添加,则请输入:exit()");//提供结束循环返回菜单的条件
							isIdExists = true;//true,继续循环提示输入歌曲id
						}else {
							break;//跳出循环
						}
					} while (isIdExists);
					
					//3.提示输入歌曲名称
					System.out.println("请输入歌曲的名称:");
					String songName = console.next();
					
					//4.提示输入演唱者信息
					System.out.println("请输入演唱者:");
					String singer = console.next();
					
					//5.生成歌曲对象
					Song song = new Song(songId, songName, singer);
					mainPlayList.addToPlayList(song);//添加到主播放列表
				}
			}break;
//添加歌曲到普通播放列表
case 2:{
				//2--将歌曲添加到普通播放列表
				System.out.println("将歌曲添加到普通播放列表");
				System.out.println("请输入要添加的播放列表名称:");
				String playListName = console.next();
				//检查输入的播放列表名称是否已存在
				PlayList addedPlayList = playListCollection.searchPlayListByName(playListName);
				if(addedPlayList == null) {
					//如果该播放列表名称还未存在,提示错误信息
					System.out.println("该播放列表不存在,请先将播放列表添加到播放器中!");
				}else {
					//播放器列表存在,执行添加歌曲到指定普通播放列表
					//1.提示要添加歌曲的数量
					int musicNum = 0;
					do {
						System.out.println("请输入要添加的歌曲的数量(输入0则返回菜单):");
						try {
							musicNum = console.nextInt();
							if(musicNum == 0) //如输入添加歌曲的数量为0,则认为不进行添加
								return ;
							else 
								break;//若输入正确(大于0的整数),跳出循环
						} catch (InputMismatchException e) {
							System.out.println("请输入不小于0的整数!");
							console.next();
						}
					}while(true);
					
					for(int i=0; i < musicNum; i++) {
						System.out.println("请输入第"+(i+1)+"首歌曲:");
						//2.提示输入歌曲id
						System.out.println("请输入歌曲id:");
						String songId = console.next();
						//若歌曲已存在,则直接添加到该普通播放列表中;
						Song searchSong = mainPlayList.searchSongById(songId);//从主播放列表中查找
						if(searchSong == null) {
							//若歌曲未存在,则录入相关信息
							System.out.println("该歌曲在主播放列表不存在,继续输入歌曲的其他信息!");
							//3.提示输入歌曲名称
							System.out.println("请输入歌曲名称:");
							String songName = console.next();
							//4.提示输入演唱者
							System.out.println("请输入演唱者:");
							String singer = console.next();
							//主播放列表与该播放列表都将添加
							Song addedSong = new Song(songId, songName, singer);
							mainPlayList.addToPlayList(addedSong);
							addedPlayList.addToPlayList(addedSong);
							//5.打印播放列表中所有歌曲,包括主播放列表和当前添加到的播放列表
							System.out.println(mainPlayList.getPlayListName() + ":");
							mainPlayList.displayAllSong();
							
							System.out.println(addedPlayList.getPlayListName() + ":");
							addedPlayList.displayAllSong();
						}else {
							addedPlayList.addToPlayList(searchSong);
						}
					}
				}
			}break;
//修改歌曲
case 5:{
				//5--修改播放列表中的歌曲
				System.out.println("修改播放列表中的歌曲");
				//1.提示输入要修改的歌曲id
				System.out.println("请输入要修改的歌曲id:");
				String songId = console.next();
				//在主播放列表中查找
				Song song = mainPlayList.searchSongById(songId);
				if(song != null) {
					//存在这首歌
					System.out.println("请输入修改后的歌曲名称:");
					String updateName = console.next();
					
					System.out.println("请输修改后的演唱者:");
					String updateSinger = console.next();
					
					song.setName(updateName);//更新歌曲名称
					song.setSinger(updateSinger);//更新演唱者
					
					System.out.println("修改成功!");
				}else {
					System.out.println("该歌曲在主播放列表中不存在,无法进行修改!");
				}
			}break;

本人有点强迫症= =,运行效果基本还原视频所演示的样子,基本按照描述所提供的API规定来编码,但这个updateSong(Song song)暂时无法理解应该如何编写,如果强行实现好像会比我现在这个代码要啰嗦。。。希望老师能解答一下:)

正在回答

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

2回答

按照同学的逻辑,只实现了修改主播放列表中的该歌曲信息。如果普通播放列表中也存在该歌曲信息,则没有修改。这里可以先输入歌曲信息,然后遍历所有的播放列表,查询歌曲是否存在,存在则修改歌曲,不存在则提示不存在。可参考如下代码:

case 5:
						System.out.println("修改播放列表中的歌曲");
						//要修改的歌曲信息
						System.out.println("请输入要修改的歌曲id:");
						String strId = sc.next();
						System.out.println("请输入修改后的歌曲名称:");
						String strName = sc.next();
						System.out.println("请输入修改后的演唱者:");
						String strSinger = sc.next();
						//新建一个Song类对象,保存要修改的歌曲信息。
						Song song = new Song(strId, strName, strSinger);
						Map<String, PlayList> playListSet = plc.getPlayListMap();//查询所有的播放列表
						Set<String> setName = playListSet.keySet();
						int count1 = 0;
						for (String playListName : setName) {//遍历所有的播放列表
							PlayList pl3 = playListSet.get(playListName);
							Song song1 = pl3.searchSongById(strId);//判断播放列表中是否存在该歌曲
							if (song1 != null) {//存在则修改
								pl3.updateSong(song);
							} else {
								count1++;
							}
						}
						if (count1 != setName.size()) {
							System.out.println("修改成功!");
						} else {
							System.out.println("该歌曲在所有播放列表中均不存在!");
						}

						break;

在updateSong(Song song)中,传入的参数是要修改的歌曲,在方法中通过歌曲id找到原来的歌曲并使用remove移除,然后使用add()方法添加修改后的歌曲信息。

如果我的回答解决了你的疑惑,请采纳。祝:学习愉快!

  • 0x0wh04m1 提问者 #1
    首先感谢老师的回答! 因为主播放列表包含所有歌曲,所以我就在主播放列表中查询指定id的歌曲了,修改的时候其实修改的是同一个对象,所以其他普通播放列表处该歌曲的信息也会修改,程序运行效果图我放在新回复里了,麻烦老师帮忙看看,不知道我是否存在哪里理解有误~
    2019-01-04 13:21:56
提问者 0x0wh04m1 2019-01-04 13:18:40

往主播放列表中添加歌曲时不会添加到其他普通播放列表。

但往普通播放列表中添加歌曲时,若输入的歌曲id已在主播放列表存在,则直接根据mainPlayList.searchSongById(主播放列表对象根据歌曲id返回对应歌曲)这个方法返回的Song对象添加到该普通播放列表;若是主播放列表不存在的歌曲,则在添加到普通播放列表后也会往主播放列表添加该Song对象(这是项目演示视频上的效果)。也就是说普通播放列表中与主播放列表中相同的歌曲是同一个对象,只要从主播放列表中获取指定id的Song对象对其进行修改,其他普通播放列表中该歌曲的信息也就修改了!

下面上程序运行效果图:

图1:向普通列表[我喜欢的]添加歌曲,添加完毕后打印主播放列表和当前所添加到的播放列表中的歌曲信息,目前s002歌曲的歌名为:Sugar,演唱者:aaaaa

http://img1.sycdn.imooc.com//climg/5c2eec3d000118a608140529.jpg

图2:修改s002歌曲的信息,修改后歌名:sugar,演唱者:singer01

http://img1.sycdn.imooc.com//climg/5c2eec510001582f06730433.jpg

图3:查询主播放列表中的歌曲信息,s002歌曲的信息已被修改

http://img1.sycdn.imooc.com//climg/5c2eec680001bf2207780449.jpg

图4:查看【我喜欢的】这个普通播放列表的歌曲信息,s002的歌曲已被修改

http://img1.sycdn.imooc.com//climg/5c2eec850001f1b807650417.jpg

确实是实现了所有播放列表中该id的歌曲的信息都进行了修改(因为操作的同一个对象)。

  • 如果修改的是同一个对象,修改主播放列表中的歌曲就可以。同学完成的不错。祝:学习愉快~
    2019-01-04 13:43:14
  • 提问者 0x0wh04m1 回复 好帮手慕阿满 #2
    谢谢老师~
    2019-01-04 14:03:50
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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