请老师检查一下我的代码

请老师检查一下我的代码

老师,想问一下

  1. 在写导入歌单的时候,为什么要把Song类和PlayList类都接上Serializablej接口?我刚开始只接了PlayList的借口,结果却报错,要2个类都接上才能不报错。

  2. 导出的歌单在TXT文件里是乱码,怎么样修改能保证TXT文件不是乱码?

  3. 以下是我写的代码,请老师检查

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

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

1回答
好帮手慕阿园 2022-02-19 11:56:05

同学你好

1、存储对象所属的类也是需要实现序列化接口的,所以这里需要两个都实现

2、这里确实会乱码,使用序列化将对象进行储存成文件格式,是一种二进制编码储存,所以打开储存的txt文件,打开是中文乱码的!所以这里并不能直接在文件中正常显示,但是同学可以将这个文件的内容通过read方法读取到控制台上哦,在控制台上是可以正常显示的就可以了~

3、代码整体完成的不错,很棒呐,但还有个地方可以优化一下,修改歌曲后,再次查询歌曲,歌曲列表是未修改的,运行效果如下

https://img1.sycdn.imooc.com//climg/621063a30999f7ff05250691.jpg

同学的代码中只修改了主播放列表,建议同学将普通列表的歌曲也进行修改

祝学习愉快~

  • 提问者 嫣语四然 #1
    谢谢老师,修改歌曲后再查询歌曲这一块,我试了好几次都没有办法在修改主播放列表时同时修改其他列表的歌曲,写的代码一直出错,想问一下老师,这部分的代码应该怎样修改?
    下载视频          
    2022-02-21 08:10:27
  • 好帮手慕小尤 回复 提问者 嫣语四然 #2

    同学你好,建议同学先查询部分列表是否存在,如果存在,则进行修改,然后在普通播放列表中查看歌曲是否存在,如果存在进行修改。参考代码如下所示:

    https://img1.sycdn.imooc.com//climg/62132418095139f210910895.jpg

    祝学习愉快!

    2022-02-21 13:34:06
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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