请老师检查一下我的代码
老师,想问一下
在写导入歌单的时候,为什么要把Song类和PlayList类都接上Serializablej接口?我刚开始只接了PlayList的借口,结果却报错,要2个类都接上才能不报错。
导出的歌单在TXT文件里是乱码,怎么样修改能保证TXT文件不是乱码?
以下是我写的代码,请老师检查
Song类
import java.io.Serializable;
/**
* 歌曲类
*
* @author yanyu
*
*/
public class Song implements Serializable{
// 属性
private String id;// 歌曲ID
private String name;// 歌曲名称
private String singer;// 演唱者
public Song() {
}
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;
}
@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) {
//判断obj是否等于当前对象this?
if (this == obj)
return true;
//既然不等于,那就比较他们的反射是否相等(class),如果相等,就把obj强制类型转换成Song的对象
else if (obj.getClass() == Song.class) {
Song song = (Song) obj;
//比较song的属性是否等于this的属性
return (song.getId().equals(id)) && (song.getName().equals(name)) && (song.getSinger().equals(singer));
}
return false;
}
public String toString() {
return "歌曲信息为: "+"歌曲ID为:"+id+" 歌曲名称为:"+name+" 歌曲演唱者为:"+singer;
}
}
PlayList类
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
/**
* 播放列表类
*
* @author yanyu
*
*/
public class PlayList implements Serializable{
// 属性
private String playListName;// 播放列表的名字
private List<Song> musicList;// 播放列表中的歌曲集合
public PlayList() {
}
/**
* 通过播放列表名称创建播放列表
*
* @param playListName
*/
public PlayList(String playListName) {
this.setPlayListName(playListName);
musicList = new ArrayList<Song>();
}
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;
}
/**
* 添加歌曲到播放列表
*
* @param song 要添加的歌曲对象
*/
public void addSong(Song song) {
// 要排除重复添加的情况
boolean flag = false;
for (Song song1 : musicList) {
if (song1.equals(song)) {
flag = true;
}
}
if (flag) {
System.out.println("该歌曲已经存在,添加失败!");
} else {
musicList.add(song);
}
}
/**
* 显示播放列表的歌曲
*
* @param playListName
*/
public void displayAllSong() {
System.out.println("播放列表的歌曲信息为:");
for (Song song : musicList) {
System.out.println(song);
}
}
/**
* 通过歌曲ID查找歌曲信息
*
* @param id 要查找的歌曲ID
* @return 歌曲song类型的对象,通过song是否为null来判断要查找的歌曲是否存在,如果为空则不存在
*/
public Song searchSongById(String id) {
Song song = null;
for (Song song1 : musicList) {
if (song1.getId().equals(id)) {
song = song1;
break;
}
}
return song;
}
/**
* 通过歌曲名称查找歌曲信息
*
* @param name 要查找的歌曲名称
* @return 歌曲song类型的对象,通过song是否为null来判断要查找的歌曲是否存在
*/
public Song searchSongByName(String name) {
Song song = null;
for (Song song1 : musicList) {
if ((song1.getName()).equals(name)) {
song = song1;
break;
}
}
return song;
}
/**
* 修改歌曲信息
*
* @param id 要修改歌曲的ID
* @param song 新的歌曲
* @return
*/
public Song updateSong(String id, Song song) {
// 方法1: musicList.remove(song1);
// musicList.add(song);先移除再添加
Song song1 = searchSongById(id);
int i = musicList.indexOf(song1);
musicList.set(i, song);// 方法2:通过indexOf方法获得该ID歌曲的索引值,再通过set方法修改数据
Song song2=musicList.get(i);//重新获得修改后的歌曲位置,并用get方法找到修改后的新歌曲。
System.out.println("歌曲修改成功");
return song2;
}
/**
* 根据歌曲ID删除播放列表中的歌曲
*
* @param id
*/
public void deleteSong(String id) {
Song song1 = searchSongById(id);
if (song1 != null) {
musicList.remove(song1);
System.out.println("歌曲ID为" + id + "的歌曲已被删除。");
} else {
System.out.println("歌曲ID为" + id + "的歌曲不存在。无法删除。");
}
}
}
PlayListCollection类
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
* 播放器类(播放列表的集合类)
* @author yanyu
*
*/
public class PlayListCollection {
private Map<String,PlayList> PlayListCl;
/**
* 构造方法,初始化播放器
*/
public PlayListCollection() {
PlayListCl=new HashMap<String,PlayList>();
}
public Map<String, PlayList> getPlayListCl() {
return PlayListCl;
}
public void setPlayListCl(Map<String, PlayList> playListCl) {
PlayListCl = playListCl;
}
/**
* 添加播放列表到播放器
* @param pl 要添加的播放列表
*/
public void addPlayList(PlayList pl) {
PlayListCl.put(pl.getPlayListName(),pl);
}
/**
* 显示所有播放列表的名称和信息
*/
public void disPlayAllList() {
Set<String>st=PlayListCl.keySet();
for(String s:st) {
System.out.println(s);
}
}
/**
* 删除播放列表
* @param PlayListName 要删除的播放列表的名字
*/
public void deletePlayList(String PlayListName) {
PlayListCl.remove(PlayListName);
System.out.println("播放列表:"+PlayListName+" 删除成功。余下的播放列表信息为");
disPlayAllList();
}
/**
* 通过播放列表名称查询播放列表
* @param PlayListName 播放列表的名称
* @return 播放列表是否为空判断播放列表是否存在,如果为空,则播放列表不存在
*/
public PlayList searchByPlayListName(String PlayListName) {
PlayList pl=null;
Set<String> plName=PlayListCl.keySet();
for(String s:plName) {
if(PlayListName.equals(s)) {
pl=PlayListCl.get(s);
}
}
return pl;
}
/**
* 通过播放列表的名称修改播放列表的信息
* @param PlayListName 要修改的播放列表的名称
* @param plst 新的播放列表的信息
* @return 已经被修改的播放列表
*/
public PlayList updatePlayList(String PlayListName,PlayList plNew) {
PlayList pl=searchByPlayListName(PlayListName);
if(pl!=null) {
pl=plNew;
}else {
System.out.println(PlayListName+"该播放列表不存在");
}
return pl;
}
}
测试类
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.Scanner;
public class TestDemo {
/**
* 主菜单
*/
public void mainMenu() {
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("1---添加歌曲到主播放列表");
System.out.println("2---添加歌曲到普通播放列表");
System.out.println("3---显示播放列表的歌曲");
System.out.println("4---通过ID查询(播放列表中的)歌曲信息");
System.out.println("5---通过名字查询(播放列表中的)歌曲信息");
System.out.println("6---修改(播放列表中的)歌曲信息");
System.out.println("7---删除播放列表的歌曲");
System.out.println("8---导出播放列表的歌单");
System.out.println("0---返回上一级菜单");
System.out.println("*****************************");
}
/**
* 播放器菜单
*/
public void PlayListClMenu() {
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("0---返回上一级菜单");
System.out.println("*****************************");
}
/**
* 主流程
*/
public void test() {
TestDemo td = new TestDemo();
int input = 0, input1 = 0, input2 = 0;
Scanner console = new Scanner(System.in);
PlayList mainPlayList = new PlayList("主播放列表");
PlayListCollection plcl = new PlayListCollection();// 播放器
plcl.addPlayList(mainPlayList);
while (true) {
td.mainMenu();
System.out.println("请输入要选择的操作:");
input = console.nextInt();
if (input == 0) {
System.out.println("退出程序!");
break;
} else {
switch (input) {
case 1:// 进入播放列表管理
while (true) {
td.PlayListMenu();
System.out.println("请输入要选择的操作:");
input1 = console.nextInt();
if (input1 == 0) {
System.out.println("返回主菜单");
break;
} else {
switch (input1) {
case 1:
System.out.println("添加歌曲到主播放列表");
System.out.println("请输入要添加几首歌:");
int n = console.nextInt();
int i = 0;
while (i < n) {
System.out.println("请输入第" + (i + 1) + "首歌曲的信息。");
System.out.println("请输入歌曲ID:");
String songId = console.next();// 歌曲ID
System.out.println("请输入歌曲名称:");
String songName = console.next();// 歌曲名称
System.out.println("请输入歌曲的演唱者:");
String songSinger = console.next();
Song song = new Song(songId, songName, songSinger);
mainPlayList.addSong(song);
i++;
}
System.out.print("主播放列表" + " ");
mainPlayList.displayAllSong();
break;
case 2:
System.out.println("添加歌曲到普通播放列表");// 注意如果歌曲在主播放列表不存在,添加的同时也要添加到主播放列表
System.out.println("请输入要添加的播放列表的名称");
String playListName = console.next();
PlayList pl = plcl.searchByPlayListName(playListName);// 通过播放列表的名称判断列表是否存在
if (pl != null)// 表示播放列表存在
{
System.out.println("请输入要添加几首歌:");
n = console.nextInt();
i = 0;
while (i < n) {
System.out.println("请输入第" + (i + 1) + "首歌曲的信息。");
System.out.println("请输入歌曲ID:");
String songId = console.next();// 歌曲ID
Song song1 = mainPlayList.searchSongById(songId);
if (song1 != null) {
pl.addSong(song1);
System.out.println("该歌曲已存在于主播放列表,已直接添加");
} else {
System.out.println("请输入歌曲名称:");
String songName = console.next();// 歌曲名称
System.out.println("请输入歌曲的演唱者:");
String songSinger = console.next();
Song song = new Song(songId, songName, songSinger);
pl.addSong(song);
mainPlayList.addSong(song);
}
i++;
}
System.out.print(playListName + " ");
pl.displayAllSong();
} else {
System.out.println(playListName + " 该播放列表不存在,请先于播放器中添加播放列表");
}
break;
case 3:
System.out.println("显示播放列表的歌曲");
System.out.println("请输入要显示的播放列表的名称");
playListName = console.next();
pl = plcl.searchByPlayListName(playListName);// 通过播放列表的名称判断列表是否存在
if (pl != null) {
System.out.print(playListName);
pl.displayAllSong();
} else {
System.out.println(playListName + " 该播放列表不存在,请先添加播放列表");
}
break;
case 4:
System.out.println("通过ID查询歌曲信息");
System.out.println("请输入要查询的歌曲ID:");
String songId = console.next();
Song song = mainPlayList.searchSongById(songId);
if (song != null) {
System.out.println(song);
} else {
System.out.println("该歌曲不存在。");
}
break;
case 5:
System.out.println("通过名字查询歌曲信息");
System.out.println("请输入要查询的歌曲名称:");
String songName = console.next();
song = mainPlayList.searchSongByName(songName);
if (song != null) {
System.out.println(song);
} else {
System.out.println("该歌曲不存在。");
}
break;
case 6:
System.out.println("修改(播放列表中的)歌曲信息");
System.out.println("请输入要修改的歌曲ID:");
songId = console.next();
song = mainPlayList.searchSongById(songId);
if (song != null) {
System.out.println("请输入新的歌曲ID");
String songNewId = console.next();
System.out.println("请输入新的歌曲名称:");
String songNewName = console.next();
System.out.println("请输入新的歌曲演唱者:");
String songNewSinger = console.next();
Song newSong = new Song(songNewId, songNewName, songNewSinger);
Song updateSong = mainPlayList.updateSong(songId, newSong);
System.out.println("歌曲修改成功。修改后的歌曲信息为:");
System.out.println(updateSong);
} else {
System.out.println("该歌曲不存在。");
}
break;
case 7:
System.out.println("删除播放列表的歌曲");
System.out.println("请输入播放列表的名称:");
playListName = console.next();
pl = plcl.searchByPlayListName(playListName);
if (pl != null) {
System.out.println("请输入要删除的歌曲ID:");
songId = console.next();
song = pl.searchSongById(songId);
if (song != null) {
pl.deleteSong(songId);
System.out.println("ID为" + songId + " 的歌曲删除成功。" + playListName + "播放列表的信息为:");
pl.displayAllSong();
} else {
System.out.println("该歌曲不存在,歌曲删除失败。");
}
} else {
System.out.println("该播放列表不存在,歌曲删除失败。");
}
break;
case 8:
System.out.println("导出播放列表的歌单");
System.out.println("请输入要导出的播放列表的名称:");
playListName = console.next();
pl = plcl.searchByPlayListName(playListName);
if (pl != null) {
try {
FileOutputStream fos = new FileOutputStream("名称.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(pl);
oos.flush();
fos.close();
oos.close();
System.out.println(playListName + " 的歌单信息已导出到根目录下,请检查。");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else {
System.out.println(playListName + " 该播放列表不存在!");
}
break;
default:
System.out.println("输入的数字没有对应的操作!");
}
}
}
break;
case 2:// 进入播放器管理
while (true) {
td.PlayListClMenu();
System.out.println("请输入要选择的操作:");
input2 = console.nextInt();
if (input2 == 0) {
System.out.println("返回主菜单");
break;
} else {
switch (input2) {
case 1:
System.out.println("添加播放列表");
System.out.println("请输入要添加的播放列表的名称:");
String playListName = console.next();
if (playListName.equals("主播放列表")) {
System.out.println("主播放列表已经存在,不能重复添加!");
} else {
PlayList pl = new PlayList(playListName);
plcl.addPlayList(pl);
System.out.println(playListName + " 已添加成功。");
}
break;
case 2:
System.out.println("显示所有播放列表的名称");
plcl.disPlayAllList();
break;
case 3:
System.out.println("删除播放列表");
System.out.println("请输入要删除的播放列表的名字:");
playListName = console.next();
PlayList pl = plcl.searchByPlayListName(playListName);
if (pl != null) {
if (playListName.equals("主播放列表")) {
System.out.println("主播放列表不能被删除!");
} else {
plcl.deletePlayList(playListName);
System.out.println(playListName + " 播放列表删除成功!");
System.out.println("播放器里余下的播放列表为:");
plcl.disPlayAllList();
}
} else {
System.out.println(playListName + " 该播放列表不存在!");
}
break;
case 4:
System.out.println("通过名称查询播放列表");
System.out.println("请输入要查询的播放列表的名称:");
playListName = console.next();
pl = plcl.searchByPlayListName(playListName);
if (pl != null) {
System.out.println(playListName + " 播放列表的信息为:");
pl.displayAllSong();
} else {
System.out.println(playListName + " 该播放列表不存在。");
}
break;
case 5:
System.out.println("修改播放列表的信息");
System.out.println("请输入要修改的播放列表的名称:");
playListName = console.next();
if (playListName.equals("主播放列表")) {
System.out.println("主播放列表的名称不能被修改!");
} else {
pl = plcl.searchByPlayListName(playListName);
if (pl != null) {
System.out.println("请输入新的播放列表的名称:");
String playListNewName = console.next();
System.out.println("请输入要添加几首歌:");
int n = console.nextInt();
int i = 0;
while (i < n) {
System.out.println("请输入第" + (i + 1) + "首歌曲的信息。");
System.out.println("请输入歌曲ID:");
String songId = console.next();// 歌曲ID
Song song1 = mainPlayList.searchSongById(songId);
if (song1 != null) {
pl.addSong(song1);
System.out.println("该歌曲已存在于主播放列表,已直接添加");
} else {
System.out.println("请输入歌曲名称:");
String songName = console.next();// 歌曲名称
System.out.println("请输入歌曲的演唱者:");
String songSinger = console.next();
Song song = new Song(songId, songName, songSinger);
pl.addSong(song);
mainPlayList.addSong(song);
}
i++;
}
System.out.print(playListName + "新的歌曲列表已添加。");
PlayList newPl = plcl.updatePlayList(playListName, pl);
System.out.println(playListNewName + " 新的歌曲列表信息为:");
newPl.displayAllSong();
} else {
System.out.println(playListName + " 该播放列表不存在。");
}
}
break;
default:
System.out.println("输入的数字没有对应的操作!");
}
}
}
break;
default:
System.out.println("输入的数字没有对应的操作!");
}
}
}
}
public static void main(String[] args) {
TestDemo td = new TestDemo();
td.test();
}
}
正在回答 回答被采纳积分+1
- 参与学习 人
- 提交作业 3802 份
- 解答问题 11489 个
本阶段带你迈入Java世界,学习Java必备基础知识,基础语法、面向对象思想以及常用工具类的使用。
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星