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

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

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(){
		
	}
	
}

将歌曲添加到普通播放列表

请输入要添加的播放列表名称:

qq

请输入要添加的歌曲数量:

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

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

2回答
好帮手慕珊 2018-01-15 14:26:57

你好!首先代码的结构上有些问题,把本来应该写到主方法中的代码也写到了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类都改一下。

祝学习愉快!

  • 提问者 幕布斯407276 #1
    我用 playListCollection.getPlayListMap().get(playListName)调用的对应播放列表名字的musicList。为什么传过来的还是主播放列表,是因为我PlayListCollection中添加播放列表中添加播放列表方法中传的是playlist么?
    2018-01-15 14:54:26
  • 好帮手慕珊 回复 提问者 幕布斯407276 #2
    因为musicList是集合的一个属性,而你把这个属性当做主播放列表的集合使用了。所以需要在代码结构上改进一下
    2018-01-15 16:08:57
  • 没懂把添加歌曲到普通播放列表等等的代码写到主方法中这种思考方式。。。我的想法是这个功能要由谁来实现,就写在对应的类中。例如新建播放列表这个功能,考虑到谁能对列表进行增删,所以就把新建列表功能写在了播放器里面。同理把所有添加歌曲的功能(包括向普通列表中)写在了列表类里面。所以把几乎所有功能都装进了列表和播放器里面。至于信息传递,歌曲在列表中,列表在播放器中,所有把所有数据存在播放器对象中,谁需要数据,就给谁传一个播放器对象。 关于主方法(test类),我理解为它是程序的入口,让它根据传入的指令调用相关的功能就好了,相关功能都在列表和播放器里面。 感觉这样考虑很刻板,传参的时候直接传了所有数据,会影响效率吧,想了解一下老师关于这个作业的想法!
    2018-01-18 12:19:11
提问者 幕布斯407276 2018-01-15 12:05:45
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());
		}
	}
	
}


问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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