往普通列表添加歌曲出现问题

往普通列表添加歌曲出现问题

package com.imooc.model;

public class Song {
	private String id;
	private String name;
	private String singer;
	//无参构造
	public Song() {
		
	}
	//带参构造
	public Song(String id, String name, String singer) {
		this.id = id;
		this.name = name;
		this.singer = singer;
	}
	//getter/setter方法
	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;
	}
	@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;
	}
	@Override
	public boolean equals(Object obj) {
		//判断对象是否相等
		if(this==obj) {
			return true;
		}
		//判断obj是否为Song类
		if(obj.getClass()==Song.class) {
			Song song = (Song)obj;
			return song.getId().equals(id)&&song.getName().equals(name)&&song.getSinger().equals(singer);
		}
		return false;
	}
	@Override
	public String toString() {
		return "歌曲信息 : id=" + id + ", name=" + name + ", singer=" + singer;
	}
	
	
}
package com.imooc.model;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class PlayList {
	// 属性:播放列表名称、播放列表中的List集合
	private String playListName;
	List<Song> musicList = new ArrayList<Song>();

	// 构造方法
	public PlayList() {

	}

	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) {
		// song在传进来之前先完成属性赋值,循环遍历播放列表,判断该歌曲是否存在
		boolean flag = true;
		for (int i = 0; i < musicList.size(); i++) {
			if (musicList.get(i).getId().equals(song.getId()) && musicList.get(i).getName().equals(song.getName())
					&& musicList.get(i).getSinger().equals(song.getSinger())) {
				System.out.println("该歌曲已存在!");
				flag = false;
				break;
			}
		}
		if (flag) {
			musicList.add(song);
		}

	}

	// 显示播放列表中所有歌曲
	public void displayAllSong() {
		if (musicList.size() == 0) {
			System.out.println("当前播放列表为空");
		} else {
			for (int i = 0; i < musicList.size(); i++) {
				System.out.println(musicList.get(i).toString());
			}
		}
	}

	// 通过id查询歌曲
	public Song searchSongById(String id) {
		Song song = new Song();
	    boolean flag = true;
		for (int i = 0; i < musicList.size(); i++) {
			if (id.equals(musicList.get(i).getId())) {
				song = musicList.get(i);
				//System.out.println(song.toString());
				flag = false;
				break;
			}
		}
		if (flag) {
			song=null;
		}
		return song;
	}

	// 通过名称查询歌曲
	public Song searchSongByName(String name) {
		Song song = new Song();
		boolean flag = true;
		for (int i = 0; i < musicList.size(); i++) {
			if (name.equals(musicList.get(i).getId())) {
				song = musicList.get(i);
				flag = false;
				break;
			}
		}
		if (flag) {
			song=null;
		}
		return song;
	}

	// 修改歌曲
	public void updateSong(Song song,String name,String singer) {
		song.setName(name);
		song.setSinger(singer);
	}
	/*public void updateSong(String id, String name, String singer) {
		for (int i = 0; i < musicList.size(); i++) {
			Song song = musicList.get(i);
			if (id.equals(song.getId())) {
				song.setName(name);
				song.setSinger(singer);
				//musicList.add(song);
				break;
			}
		}

	}*/

	// 从播放列表删除歌曲
	public void deleteSong(String id) {
		for (int i = 0; i < musicList.size(); i++) {
			Song song = musicList.get(i);
			if (id.equals(song.getId())) {
				musicList.remove(song);
				break;
			}
		}
	}

	// 导出歌单
	public void exportPlayList() {

	}
}
package com.imooc.model;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Scanner;
import java.util.Set;

public class PlayListCollection {
	// 属性:存放播放列表的集合:Map
	private Map<String, PlayList> map = new HashMap<String, PlayList>();
	Scanner sc = new Scanner(System.in);

	// 无参构造
	public PlayListCollection() {

	}

	// 带参构造
	public PlayListCollection(Map<String, PlayList> map) {
		this.map = map;
	}

	// getter/setter方法
	public Map<String, PlayList> getMap() {
		return map;
	}

	public void setMap(Map<String, PlayList> map) {
		this.map = map;
	}

	// 方法:添加播放列表
	public void addPlayList(PlayList playList) {
		System.out.println("向播放器中添加播放列表");
		System.out.println("请输入要添加的播放列表名称:");
		String name = sc.next();
		map.put(name, playList);
		System.out.println("添加成功!");

	}

	// 方法:删除播放列表
	public void deletePlayList(PlayList playList) {
		System.out.println("删除播放列表");
		if (map.size() == 0) {
			System.out.println("当前没有播放列表,请先创建播放列表");
		} else {			
			System.out.println("请输入要删除的播放列表:");
			String collection = sc.next();
			//取得keySet
			Set<String> keySet = map.keySet();
			boolean flag = true;
			for(String set:keySet) {
				if(set.equals(collection)) {
					map.remove(set);
					System.out.println("删除成功!");
					flag = false;
					break;
				}
			}
			if(flag) {
				System.out.println("该播放列表不存在");
			}
		}
	}

	// 方法:通过名字查询播放列表
	public PlayList searchPlayListByName(String playListName) {
		if(map.size()==0) {
			System.out.println("当前播放列表为空");
		}else {
			
			Set<String> keySet = map.keySet();
			boolean flag = true;
			for(String key:keySet) {
				if(key.equals(playListName)) {
					System.out.println("该播放列表存在");
					System.out.println("该播放列表名称为:"+key);
					System.out.print("播放列表中所有歌曲为:");
					map.get(key).displayAllSong(); 
					flag = false;									
				}
			}
			if(flag) {
				System.out.println("该播放列表不存在");
			}
		}
		return null;	

	}
	//方法:通过id查询歌曲信息
	public void searchSongById(String id,String playListName) {
		Set<String> keySet = map.keySet();
		boolean flag = true;
		for(String key:keySet) {
			if(key.equals(playListName)) {
				map.get(key).searchSongById(id);
				break;
			}else {
				System.out.println("歌曲不存在!");
			}
		}
	}
	
	//方法:通过歌曲名称查询歌曲信息
		public void searchSongByName(String name,String playListName) {
			Set<String> keySet = map.keySet();
			boolean flag = true;
			for(String key:keySet) {
				if(key.equals(playListName)) {
					map.get(key).searchSongByName(name);
					break;
				}else {
					System.out.println("歌曲不存在!");
				}
			}
		}
		
	//修改歌曲信息,所有列表中该歌曲信息都被修改
		//如果歌曲id不存在,应该怎么提示?
		/*public void updateSong(String id) {
			Set<String> keySet = map.keySet();
			System.out.println("请输入修改后的名称:");
			String name = sc.next();
			System.out.println("请输入修改后的演唱者:");
			String singer = sc.next();
			for(String key:keySet) {
				PlayList playList = map.get(key);
				playList.updateSong(id,name,singer);
				System.out.println("修改成功!");
			}
		}*/
	//删除歌曲信息
		/*public void deleteSong() {
			System.out.println("请输入要删除的歌曲id:");
			String id = sc.next();
			Set<String> keySet = map.keySet();
			for(String key:keySet) {
				PlayList playList = map.get(key);
				playList.deleteSong(id);
				System.out.println("删除成功!");
			}
			
		}*/

	// 方法:显示所有播放列表名称
	public void displayPlayList() {
		System.out.println("显示所有播放列表名称");
		if(map.size()==0) {
			System.out.println("当前播放列表为空!");
		}else {
			Set<Entry<String,PlayList>> entrySet = map.entrySet();
			for(Entry<String,PlayList> entry:entrySet) {
				System.out.println(entry.getKey());
			}
		}

	}
	//判断播放列表是否存在
	public boolean booleanList(String listName) {
		boolean flag=false;
		Set<String> keySet = map.keySet();
		for(String key:keySet) {
			if(key.equals(listName)) {
				flag = true;
				break;
				}
		}
		return flag;
		
	}
}

package com.imooc.test;


import java.util.List;

import java.util.Scanner;

import java.util.Set;


import com.imooc.model.PlayList;

import com.imooc.model.PlayListCollection;

import com.imooc.model.Song;


public class TestDemo {

// 主菜单

public void mainMenu() {

System.out.println("********************************");

System.out.println("          **主菜单**");

System.out.println("          1-播放列表管理");

System.out.println("          2-播放器管理");

System.out.println("          0-退出");

System.out.println("********************************");

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("********************************");

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("          5-返回上一级菜单");

System.out.println("********************************");

System.out.println("请输入对应数字进行操作:");


}


public static void main(String[] args) {

TestDemo test = new TestDemo();

Song song = new Song();

PlayList playList = new PlayList();

// PlayList playList1 = new PlayList();

PlayListCollection player = new PlayListCollection();

player.getMap().put("主播放列表", playList);

test.mainMenu();

Scanner sc = new Scanner(System.in);

boolean flag = true;

while (flag) {

int i = sc.nextInt();

switch (i) {

case 1:

test.playListMenu();

boolean flag1 = true;

while (flag1) {

int j = sc.nextInt();

switch (j) {

case 1:

// 将主播放列表设置为默认存在的

System.out.println("将歌曲添加到主播放列表:");

System.out.println("请输入添加歌曲数量:");

int x = sc.nextInt();

for (int y = 1; y <= x; y++) {

System.out.println("请输入第" + y + "首歌曲id:");

song.setId(sc.next());

System.out.println("请输入第" + y + "首歌曲名称:");

song.setName(sc.next());

System.out.println("请输入第" + y + "首演唱者:");

song.setSinger(sc.next());

playList.addToPlayList(song);

player.getMap().put("主播放列表", playList);

song = new Song();

}

// playList = new PlayList();

test.playListMenu();

break;

case 2:

System.out.println("将歌曲添加到普通播放列表:");

if (player.getMap().size() == 1 && player.getMap().containsKey("主播放列表")) {

System.out.println("还未创建普通播放列表!");

} else {

System.out.println("请输入要添加的播放列表名称:");

String name = sc.next();

// boolean flag3 = player.booleanList(name);

boolean flag3 = true;

for(String key:player.getMap().keySet()) {

if(key.equals(name)) {

flag3=false;

PlayList playList1 = player.getMap().get(key);

System.out.println("请输入要添加的歌曲数量:");

int n = sc.nextInt();

for (int m = 1; m <= n; m++) {

System.out.println("请输入第" + m + "首歌曲id:");

String id = sc.next();

boolean f = true;

PlayList pl = player.getMap().get("主播放列表");

for (int a = 0; a < pl.getMusicList().size(); a++) {

Song s = pl.getMusicList().get(a);

if (s.getId().equals(id)) {

System.out.println("第" + m + "首歌曲添加成功");

playList1.addToPlayList(s);

f = false;

break;

}

}

if (f) {

System.out.println("该歌曲在主播放列表中不存在,请继续输入其他信息");

// 此时添加的歌曲也要加进主播放列表中

song.setId(id);

System.out.println("请输入歌曲名称:");

song.setName(sc.next());

System.out.println("请输入演唱者");

song.setSinger(sc.next());

playList1.addToPlayList(song);

playList.addToPlayList(song);

System.out.println("第" + m + "首歌曲添加成功");

player.getMap().put("主播放列表", playList);

song = new Song();

}

}

player.getMap().put(name, playList1);

System.out.println("歌曲添加成功!");

break;

}

}


if (flag3) {

System.out.println("该播放列表不存在!");

}

}

test.playListMenu();

break;

case 3:

System.out.println("请输入要查询的播放列表:");

String listName = sc.next();

boolean flag3 = player.booleanList(listName);

if (flag3) {

System.out.println("请输入要查询的歌曲id:");

String id = sc.next();

player.searchSongById(id, listName);

} else {

System.out.println("该播放列表不存在!");

}

test.playListMenu();

break;

case 4:

System.out.println("请输入要查询的播放列表:");

String listName2 = sc.next();

boolean flag4 = player.booleanList(listName2);

if (flag4) {

System.out.println("请输入要查询的歌曲名称:");

String name = sc.next();

player.searchSongById(name, listName2);

} else {

System.out.println("该播放列表不存在!");

}

test.playListMenu();

break;

case 5:

// 修改一个列表之后,其他所有列表信息都随之改变

System.out.println("请输入要修改的歌曲id:");

String id1 = sc.next();

System.out.println("请输入修改后的歌曲名称:");

String name1 = sc.next();

System.out.println("请输入修改后的演唱者:");

String singer1 = sc.next();

boolean flag5 = true;

for (String key : player.getMap().keySet()) {

Song song1 = player.getMap().get(key).searchSongById(id1);

if (song1 == null) {

System.out.println("id不存在");

} else {

player.getMap().get(key).updateSong(song1, name1, singer1);

}

}

test.playListMenu();

break;

case 6:

// 在普通播放列表删除歌曲之后,主播放列表及其他列表中信息不变

// 在主播放列表中删除歌曲后,普通播放列表中的歌曲也随之删除

System.out.println("请输入要删除的歌曲id:");

boolean flag6 = true;

String id2 = sc.next();

for (String key : player.getMap().keySet()) {

List<Song> list = player.getMap().get(key).getMusicList();

for (int b = 0; b < list.size(); b++) {

if (id2.equals(list.get(b).getId())) {

player.getMap().get(key).deleteSong(id2);

System.out.println("删除成功!");

flag6 = false;

break;

}

}

}

if (flag6) {

System.out.println("id不存在!");

}

test.playListMenu();

break;

case 7:

System.out.println("请输入要显示的播放列表:");

String listName1 = sc.next();

boolean flag7 = player.booleanList(listName1);

if (flag7) {

player.searchPlayListByName(listName1);

} else {

System.out.println("该播放列表不存在!");

}

test.playListMenu();

break;

case 8:// 对象序列化,列表名称+的歌单.txt

System.out.println("请输入要导出的歌单:");

test.playListMenu();

break;

case 9:

flag1 = false;

test.mainMenu();

break;

default:

System.out.println("输入信息不正确,请重新输入");

break;

}

}

break;

case 2:

test.playerMenu();

boolean flag2 = true;

while (flag2) {

int k = sc.nextInt();

switch (k) {

case 1:

player.addPlayList(playList);

test.playerMenu();

break;

case 2:

player.deletePlayList(playList);

test.playerMenu();

break;

case 3:

System.out.println("请输入要查询的播放列表名称:");

String playListName = sc.next();

player.searchPlayListByName(playListName);

test.playerMenu();

break;

case 4:

player.displayPlayList();

test.playerMenu();

break;

case 5:

flag2 = false;

test.mainMenu();

break;

default:

System.out.println("输入信息不正确,请重新输入!");

test.playerMenu();

break;

}

}

break;

case 0:

flag = false;

break;

default:

System.out.println("输入信息不正确,请重新输入!");

test.mainMenu();

break;

}

}


}


}按照老师提供的思路,往普通列表添加歌曲时,先遍历集合判断该列表是否存在,然后获取该列表的playList,但是我的代码出现了问题

正在回答

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

2回答

修改意见,

1、如下图所示,创建一个主播放列表对象,为了形象一点,我起名为mainPlayList,然后将mainPlayList对象添加到播放器中。

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

在case1中,需要将歌曲信息添加到主播放列表中,所以使用mainPlayList对象调用addPlayList方法将歌曲信息添加进主播放列表中,可以参照下图进行修改。

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

然后在case2中,当获得普通播放列表的对象时,使用普通播放列表对象调用addToPlayList方法,这样你的歌曲信息就不会乱了,建议你在代码中添加适量的注释,不要定义那么多相似的变量信息,很容易搞混。

2、在searchPlayListByName方法中你不应该只返回null,可以这么修改,如果在该方法中有对应的播放列表,就返回该播放列表的对象,如果没有则返回null,这样在测试类中,我们就可以通过该方法返回的值进行操作了,譬如case2中的逻辑可以这么写,当从控制台接收用户录入的播放列表名称时,我们可以调用该方法,如果播放列表存在,则返回该播放列表的对象,然后使用该对象调用添加歌曲的方法,如果播放列表不存在,则返回null,则提示用户该播放列表不存在,这种逻辑就清晰简单。如果有不明白的地方还可以继续提问,祝学习愉快~

一叶知秋519 2018-09-12 19:06:44

作业中普通播放列表和主播放播放列表共用了一个PlayList,所以在添加歌曲的时候出现了混乱的情况;

在主方法开始之前,创建主播放列表,并添加到播放器,即:

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

注意在PlayList类中增加带名称的构造方法

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

建议同学先根据上面思路进行播放列表的区分,区分以后再进行其他代码的调试。

如果还有问题,可以再次提问。祝学习愉快!

  • 提问者 慕桂英8566455 #1
    老师我还是没懂为什么会和主播放列表公用啊 在case2里面,我有遍历map来获取该普通列表的playList,代码PlayList playList2=player.getMap().get(key),主播放列表的为playList,为什么会共享呢?
    2018-09-12 22:29:01
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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