上一阶段课程,播放器作业,怎样实现普通列表和主播放列表的歌曲分别存放在不同的列表?

上一阶段课程,播放器作业,怎样实现普通列表和主播放列表的歌曲分别存放在不同的列表?

怎样实现普通列表和主播放列表的歌曲分别存放在不同的列表?

package com.player.model;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;
//播放列表类
public class PlayList {
 private String playListName;
 private List<Song> musicList=new ArrayList<Song>();
 
 public PlayList() {}
 public PlayList(String playListName,List<Song> musicList) {
  this.playListName = playListName;
  this.musicList = musicList;
 }
 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) {
    musicList.add(song);
 }
// -显示播放列表中所有歌曲:
 public void displayAllSong() {
  for(int i=0;i<musicList.size();i++) {
   System.out.println(musicList.get(i));
  }
 }
// -通过id查询歌曲:
 public Song searchSongById(String id) {
  for(int i=0;i<musicList.size();i++) {
   if(id.equals(musicList.get(i).getId())) {
    return musicList.get(i);//因为有序,所以可以通过遍历,list.get(i)返回list对象
   }
  }
  return null;
  
 }
// -通过名称查询歌曲:
 public Song searchSongByName(String n) {
  for(int i=0;i<musicList.size();i++) {
   if(n.equals(musicList.get(i).getName())) {
    return musicList.get(i);
   }
  }
  return null;
 }
// -修改歌曲:
 public void updateSong(String id,Song song) {
  musicList.remove(searchSongById(id));//删除
  musicList.add(song);//添加
 }
// -从播放列表删除歌曲:
 public void deleteSong(String id) {
  musicList.remove(searchSongById(id));
 }
//    - 导出歌单 :
 public void exportPlayList() {
          try {
              FileOutputStream fos = new FileOutputStream(this.getPlayListName()+"的歌单.txt");
              ObjectOutputStream oos = new ObjectOutputStream(fos);
              oos.writeObject(musicList);
              oos.flush();
              oos.close();
              fos.close();
          } catch (FileNotFoundException e) {
              e.printStackTrace();
          } catch (IOException e) {
              e.printStackTrace();
          }
  
 }
 public String toString() {
  return "播放列表名称:"+getPlayListName();
 }
}


package com.player.model;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
//播放器类
public class PlayListCollection{
 private Map<String,PlayList> playListMap=new HashMap<String,PlayList>();
 
 public PlayListCollection() {}
 public PlayListCollection(Map<String,PlayList> playListMap) {
  this.playListMap = playListMap;
 }
 
public Map<String, PlayList> getPlayListMap() {
  return playListMap;
 }
 public void setPlayListMap(Map<String, PlayList> playListMap) {
  this.playListMap = playListMap;
 }
 // 添加播放列表:
 public void addPlayList(PlayList playList) {
  String key=playList.getPlayListName();
  PlayList value=playList;
  playListMap.put(key, value);
 }
// -删除播放列表:
 public void deletePlayList(PlayList playList) {
  playListMap.remove(playList.getPlayListName());//Map.remove(key);
 }
// -通过名字查询:
 public PlayList searchPlayListByName(String playListName) {
  Set<String> keySet=playListMap.keySet();//Map的查询方法,放入Set中,用keySet()方法得到key值
  for(String key:keySet) {
   if(playListName.equals(key)) {
    return(playListMap.get(key));//通过Map.get(key)找到value值
   }
  }
  return null;
 }
// -显示所有播放列表名称:
 public void displayPlayListName() {
  Iterator<PlayList> it=playListMap.values().iterator();
  while(it.hasNext()) {
   System.out.print(it.next().getPlayListName()+" ");
//System.out.print(it.next()+" ");查看代码发现,it.next()是输出播放列表的对象,应该改为it.next().getPlayListName()
  }
 }
 
}


package com.player.model;
//歌曲类
public class Song implements java.io.Serializable{
// 导出歌单报错,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;
 }
 
 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;
 }
 public String toString() {
  return "歌曲信息为:歌曲id:"+getId()+"歌曲名:"+getName()+"演唱者:"+getSinger();
 }
 @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;
  if (obj == null)
   return false;
  if (getClass() != obj.getClass())
   return false;
  Song other = (Song) obj;
  if (id == null) {
   if (other.id != null)
    return false;
  } else if (!id.equals(other.id))
   return false;
  if (name == null) {
   if (other.name != null)
    return false;
  } else if (!name.equals(other.name))
   return false;
  if (singer == null) {
   if (other.singer != null)
    return false;
  } else if (!singer.equals(other.singer))
   return false;
  return true;
 }
 
}


package com.player.test;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.InputMismatchException;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Scanner;
import java.util.Set;
import com.player.model.PlayList;
import com.player.model.PlayListCollection;
import com.player.model.Song;
public class TestDemo {
 boolean flag=false;
 boolean flag1=false;
 
 List<Song> musicList=new ArrayList<Song>();
 PlayList p1 = new PlayList("主播放列表",musicList);
 
 Map<String,PlayList> playListMap=new HashMap<String,PlayList>();
 Set<Entry<String,PlayList>> entrySet=playListMap.entrySet();//entrySet方法取出所有key和value值
 PlayListCollection plc=new PlayListCollection(playListMap);
 
 Scanner console = new Scanner(System.in);
 int i = 0;
 
 public void menu() {
  plc.addPlayList(p1);//因为HashMap不会加入重复的
  System.out.println("***********************************");
  System.out.println("**主菜单**");
  System.out.println("1--播放列表管理");
  System.out.println("2--播放器管理");
  System.out.println("0--退出");
  System.out.println("***********************************");
  System.out.println("请输入对应数字进行操作:");
  do {
   flag=false;
   try {
    i = console.nextInt();
   } catch (InputMismatchException e) {
    System.out.println("请输入数字");
    console.next();// 抛出异常,重新接收输入
   }
   
   if (i == 0 || i == 1 || i == 2) {
    switch (i) {
    case 1:
     flag=false;
     playList();
     break;
    case 2:
     flag=false;
     playListCollection();
     break;
    case 0:
     flag=false;
     System.out.println("谢谢光临");
     break;
    }
   }
   else {
    System.out.println("请输入0~2:");
    flag=true;
   }
  }while(flag==true);
 }
 public void playList() {
  while(!flag1) {
  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("请输入对应的数字对播放列表进行管理:");
  do {
    flag=false;
   try {
    i = console.nextInt();
   } catch (InputMismatchException e) {
    System.out.println("请输入数字");
    console.next();// 抛出异常,重新接收输入
    continue;
   }
   if (i < 10) {
    switch (i) {
    case 1:
 
     System.out.println("将歌曲添加到主播放列表");
     System.out.println("请输入要添加的歌曲的数量:");
     int j = 0;// 用于循环次数而已
     try {
      j = console.nextInt();
     } catch (InputMismatchException e) {
      System.out.println("请输入数字");
      console.next();// 抛出异常,重新接收输入
     }
     for (int k = 1; k <= j; k++) {
      System.out.println("请输入第" + k + "首歌曲");
      System.out.println("请输入歌曲的id:");
      String sid = console.next();
      System.out.println("请输入歌曲的名称:");
      String sname = console.next();
      System.out.println("请输入歌曲的演唱者:");
      String ssinger = console.next();
      p1.addToPlayList(new Song(sid, sname, ssinger));// 参数直接new Song("","","")同时传参
     }
     break;
     case 2: 
      
      System.out.println("将歌曲添加到普通放列表");
      System.out.println("请输入要添加的播放列表名称:");
      String lname=console.next();
      if(plc.searchPlayListByName(lname)==null) {//悖论
//      if(p1==null) {
       System.out.println("该播放列表不存在,请先将播放列表添加到播放器中!");
      }else {
       System.out.println("请输要添加的歌曲数量:");
        j = 0;// 用于循环次数而已
        do {
         flag=false;
         try {
          j = console.nextInt();
         } catch (InputMismatchException e) {
          System.out.println("请输入数字");
          flag=true;
          console.next();// 抛出异常,重新接收输入
         }
        }while(flag==true);
       for(int k=1;k<=j;k++) {
       System.out.println("请输入第"+k+"首歌曲");
       System.out.println("请输入歌曲的id:");
       String sid=console.next();
        flag=false;
        for(int q=0;q<p1.getMusicList().size();q++) {
         if(sid.equals(p1.getMusicList().get(q).getId())) {
//          playListMap.get(lname).addToPlayList(playListMap.get(lname).searchSongById(sid));//playListMap.get(lname)返回PlayList对象
//          另外,向普通播放列表添加数据,也不应该是从普通播放列表查找数据添加进去,应该是从主播放列表查找数据进行添加。
          playListMap.get(lname).addToPlayList(p1.searchSongById(sid));
          flag=true;
          break;
          }
         }
        if(!flag) {
         System.out.println("请输入歌曲的名称:");
         String sname=console.next();
         System.out.println("请输入歌曲的演唱者:");
         String ssinger=console.next();
         playListMap.get(lname).addToPlayList(new Song(sid,sname,ssinger));
         p1.addToPlayList(new Song(sid,sname,ssinger));//主播放列表也添加该歌曲
        }
        }
       
       }
      break;  
     case 3:
      
      System.out.println("通过歌曲id查询播放列表中的歌曲");
      System.out.println("请输入要查询的播放列表名称:");
      lname=console.next(); 
       if(plc.searchPlayListByName(lname)==null) {
        System.out.println("无此播放列表");
       }else {
        System.out.println("请输入要查询的歌曲id:");
        String sid=console.next();
        flag=false;
        for(int q=0;q<p1.getMusicList().size();q++) {
         if(sid.equals(plc.searchPlayListByName(lname).getMusicList().get(q).getId())) {
          System.out.println(plc.searchPlayListByName(lname).searchSongById(sid));
          flag=true;
          break;
         }
        }
        if(!flag) {
         System.out.println("该歌曲不存在!");
         flag=true;
        }
       
//else {System.out.println("该歌曲在播放列表"+plc.searchPlayListByName(lname)+"中不存在!");}
//切记不要在循环中写else,因为如果循环执行多次,肯定有歌曲是不符合要求的,即使歌曲存在,也会将不存在的信息多次输出。
       }
      break;
     
      case 4:
      System.out.println("通过歌曲名称查询播放列表中的歌曲");
      System.out.println("请输入要查询的播放列表名称:");
      lname=console.next();
      if(playListMap==null){ 
       System.out.println("无此播放列表");
      }
      else if(plc.searchPlayListByName(lname)==null) {
       System.out.println("无此播放列表");
       }
      else {
       System.out.println("请输入要查询的歌曲名称:");
       String sname=console.next();
       flag=false;
       for(int q=0;q<p1.getMusicList().size();q++) {
        if(sname.equals(plc.searchPlayListByName(lname).getMusicList().get(q).getName())) {
         System.out.println(plc.searchPlayListByName(lname).searchSongByName(sname));
         flag=true;
         break;
        }
        }
       if(!flag) {
        System.out.println("抱歉,没有该歌曲哟");
       }
      }
      break;
      case 5:
       System.out.println("修改播放列表中的歌曲");
       System.out.println("请输入要修改歌曲的id:");
       String sid=console.next();
       System.out.println("请输入要修改歌曲的名称:");
       String sname=console.next();
       System.out.println("请输入要修改歌曲的演唱者:");
       String ssinger=console.next();
       
       for(Entry<String,PlayList> entry:entrySet) {
        (entry.getValue()).updateSong(sid,new Song(sid,sname,ssinger));
        }
       
       break;
       case 6:        
       System.out.println("删除播放列表中的歌曲");
       System.out.println("请输入要的操作的播放列表");
       lname=console.next();
       System.out.println("请输入要删除歌曲的id:");
       sid=console.next();
       if(lname.equals("主播放列表")) {
        for(Entry<String,PlayList> entry:entrySet) {
         (entry.getValue()).deleteSong(sid);
         }
       }else {
        plc.searchPlayListByName(lname).deleteSong(sid);
       }      
       break;
       case 7:      
       System.out.println("显示播放列表中的所有歌曲");
       System.out.println("请输入要显示的播放列表的名称:");
       lname=console.next();
       if(playListMap==null){ 
        System.out.println("无此播放列表");
       }
       else if(plc.searchPlayListByName(lname)==null) {
        System.out.println("无此播放列表");
        }
       else{
        plc.searchPlayListByName(lname).displayAllSong();//此处遍历的是所有播放列表存放的歌单,并且list方式会重复
        }
       break;
       case 8:        
       System.out.println("导出歌单");
       System.out.println("请输入要导出的播放列表的名称:");
       lname=console.next();
       plc.searchPlayListByName(lname).exportPlayList();
       break;
       case 9:
       menu();
       flag1=true;
       break;
 
    }
   }
   else {
    System.out.println("error");
    flag=true;
   }
  }while(flag1==true);
 }
 }
 public void playListCollection() {
  while(!flag1) {
  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("9--返回上一级菜单");
  System.out.println("***********************************");
  System.out.println("请输入对应的数字对播放器进行管理:");
  
   try{
    i=console.nextInt();
    }catch(InputMismatchException e) {
     System.out.println("请输入数字");
     console.next();//抛出异常,重新接收输入
     continue;//前面用flag,do,while也可以。但是continue更简捷,但是非指定数字未处理,此处省略,处理见上。
    }
   if(i==1||i==2||i==3||i==4||i==9) {
    switch (i) {
    case 1:
     System.out.println("向播放器添加播放列表");
     System.out.println("请输入要添加的播放列表的名称:");
     String lname=console.next();
//     List<Song> p=new ArrayList<Song>();
     
     plc.addPlayList(new PlayList(lname,musicList));
     break;
    case 2: 
     System.out.println("向播放器删除播放列表");
     lname=console.next();
     if(playListMap==null){ 
      System.out.println("无此播放列表");
     }
     else if(plc.searchPlayListByName(lname)==null) {
      System.out.println("无此播放列表");
      }
//      删除播放列表时,先判断查询的播放列表是否为null,如果为null要给出错误提示,如果不为null再删除。
//      之所以会报错,是因为如果playList为null,在调用getPlayListName()方法时就会报错。
     else{
      plc.deletePlayList(plc.searchPlayListByName(lname));
      System.out.println("删除成功!");
      }
     break;
    case 3: 
     System.out.println("通过名字查询播放列表信息");
     lname=console.next();
     if(playListMap==null){ 
      System.out.println("无此播放列表");
     }
     else if(plc.searchPlayListByName(lname)==null) {
      System.out.println("无此播放列表");
      }
     else {
      System.out.println("该列表找到了!");      
     }
     break;
    case 4: 
     System.out.println("显示所有播放列表名称");
     plc.displayPlayListName();
     p1.toString();
     break;
    case 9:
     System.out.println("返回上一级菜单");
     menu();
     flag1=true;
     break;
    }
   }
  
 }
 
}
 
 
 public static void main(String[] args) {
  TestDemo testDemo=new TestDemo();
  testDemo.menu();
 }
}


正在回答 回答被采纳积分+1

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

3回答
好帮手慕珊 2019-05-04 18:08:02

你好!之所以报错,是因为如下选中的语句,每次创建新的PlayList对象,都用的同一个musiceList,建议将musicList改为new ArrayList<Song>()。其实,PlayList的构造方法,可以只带一个播放列表名称作为参数,这样创建对象时只传递一个字符串作为参数就可以了。


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

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

好帮手慕柯南 2019-05-04 10:13:00

同学你好!在 PlayList有两个属性 playListName和musicList,我们在PlayListCollection类中有一个添加播放列表的方法:

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

在该方法中我们传递了一个PlayList类,在方法体中将playListName当作了Map的key,musicList当作了Map的value,这样我们通过key(列表名称)就可以得到相应的value(歌曲列表),与此同时也将playListName和musicList关联起来了。

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

  • 提问者 bbb绑绑绑 #1
    追问:老师你好! 我在TestDemo中写了:List<Song> musicList=new ArrayList<Song>(); PlayList p1 = new PlayList("主播放列表",musicList); 这两句,出现问题:【新添加的 其他所有普通播放列表 用的都是同一个musicList。】 求解:怎么修改才使得“播放列表管理”的第7个功能“显示播放列表中的所有歌曲”正确显示?
    2019-05-04 14:06:01
好帮手慕阿满 2019-05-01 12:12:26

同学你好,建议同学在PlayList类中添加一个单参数的构造方法,参数是播放列表的名称。如:

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

然后在向播放器中添加播放播放列表时,新建一个带参数的播放列表到播放器,如:

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

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

  • 提问者 bbb绑绑绑 #1
    追问:那怎样解决不同播放列表里面的歌分别放在不同的歌曲集? PlayList有两个属性 playListName和musicList,就是怎样把 歌曲集musicList和 列表名playListName关联起来,每添加一个播放列表就开辟一块新的歌曲集存放该列表下的所有歌曲信息。 这个知识点我有点生疏,请老师解答一下~
    2019-05-01 19:50:30
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

0 星
从网页搭建入门Java Web2018版
  • 参与学习           人
  • 提交作业       1088    份
  • 解答问题       10205    个

如果你有Java语言基础,又想以后从事Java Web开发,那么本路径是你的不二选择!本路径从网页搭建开始入手,通过大量案例来学习Java Web基础。定能助你完成Java Web小白的蜕变!

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

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