android基礎學習-java篇day11-綜合測試-播放器管理系統

發條魚發表於2018-09-15

播放器管理系統

  • 需求分析
  • 詳細設計
  • 程式碼實現
  • 遇到問題

需求分析

播放器列表管理:

播放器列表管理的主要功能:

  • 將歌曲新增到主播放列表
  • 將歌曲新增到普通列表
  • 通過歌曲id查詢播放列表中的歌曲
  • 通過歌曲名稱查詢播放列表中的歌曲
  • 修改播放列表中的歌曲
  • 刪除播放列表中的歌曲
  • 顯示播放列表的中的所有歌曲
  • 匯出歌單

播放器管理主要功能:

  • 向播放器新增播放列表
  • 從播放器刪除播放列表
  • 通過名字查詢播放列表資訊
  • 顯示所有播放列表名稱 

詳細設計

  •  歌曲類(Song)

屬性:歌曲(id)、歌曲名(name)、演唱者(singer)、均為字串型別

方法

  1. -構造方法
  2. -getter和setter方法
  3. -hashCode()和equals()方法
  4. -toString()方法
  • 播放列表類(PlayList)

屬性:

  • -播放列表名稱(playListName):字串型別
  • -播放列表中的歌曲集合(musicList):List型別

方法:

  • -構造方法
  • -getter和setter方法
  • -將歌曲新增到播放列表:public void addToPlayList(Song song)
  • -顯示播放列表中所有歌曲:public displayAllSong()
  • -通過id查詢歌曲:public Song searchSongById(String id)
  • -通名稱查詢歌曲: public Song searchSongByName(String name)
  • -修改歌曲:public void updateSong(String id,Song song)
  • -從播放列表(通過id)刪除歌曲:public void deleteSong(String id)
  • -匯出所有歌曲
  • 播放器類(PlayListCollection)

屬性

-存放播放列表的集合(playListMap):Map

方法:

  • -構造方法
  • -getter和setter方法
  • -新增播放列表:public void addPlayList(PlayList playList);
  • -刪除播放列表:public void deletePlayList(PlayList playList);
  • -通過名字查詢:public PlayList searchPlayListByName(String playListName);
  • -顯示所有播放列表的名稱:public void displayPlayListName();
  • 測試類(TestDemo)

遇到問題:

  1. 新增song時,在向List新增元素時,musicList.add(song1);每次新增都會將以前的內容覆蓋掉,原因是每次的引用地址都相同。解決方式:在前面程式碼 加Song song1=new Song();讓它每次都產生不一樣的引用地址
  2. 難點重點:Map中的<key,value>,key值存的事列表名稱playListName(一個主列表固定,多個普通列表需要自己新增),value值是裝歌曲的List類中的ArrayList;遍歷value值是一個List物件,將它強轉換成(List)再進行List的操作,List遍歷後是Song物件,再通過強轉成Song類,進行Song的操作,Song類返回值重寫toString就可以返回你想要的格式;

程式碼實現:

Song.java

package com.demo.homework;

public class Song {
	private String id;
	private String name;
	private String singer;
	

	public Song() {
		super();
		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;
	}


	public String toString() {
		
		return "歌曲編號:"+this.getId()+" "+"歌曲名稱:"+this.getName()+" "+"演唱者:"+this.getSinger();
		
	}
	

}

PlayList.java

package com.demo.homework;
/*
 * 播放列表類
 */

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map.Entry;
import java.util.Scanner;
import java.util.Set;

public class PlayList {
	private String playListName;// 播放列表名稱
	public List musicList = new ArrayList();// 播放列表的歌曲集合
    public PlayListCollection p = new PlayListCollection();
    public List mainList = new ArrayList();//主播放列表
    public String mainName;
 
	public String getMainName() {
		return mainName;
	}

	public String setMainName(String mainName) {
		return this.mainName = mainName;
	}

	public List getMainList() {
		return mainList;
	}

	public void setMainList(List mainList) {
		this.mainList = mainList;
	}

	public PlayList() {
		this.setMusicList(musicList);
		this.setPlayListName(playListName);
	}

	public String getPlayListName() {
		return playListName;
	}

	public String setPlayListName(String playListName) {
		return this.playListName = playListName;
	}
	

	public List getMusicList() {
		return musicList;
	}

	public void setMusicList(List musicList) {
		this.musicList = musicList;
	}

	// 將歌曲新增到播放列表
	public void addToPlayList(Song song, boolean state) {
		Scanner sc = new Scanner(System.in);
		if (state) {// 如果點選的是新增到主列表的操作
			String key=setMainName("main");
			System.out.println("輸入新增歌曲的數量:");
			int n = sc.nextInt();// 獲取歌曲的數量,從而做幾次迴圈
			int flag = 0;
			while (flag < n) {
				Song song1 = new Song();// 每次新建一個物件,讓Song的物件產生不同的id
				System.out.println("輸入第" + (flag + 1) + "首歌曲的id:");
				song1.setId(sc.next());
				System.out.println("輸入第" + (flag + 1) + "首歌曲的名稱:");
				song1.setName(sc.next());
				System.out.println("輸入第" + (flag + 1) + "首歌曲的演唱者:");
				song1.setSinger(sc.next());
				musicList.add(song1);
				((List) p.playListMap.get(key)).add(song1);// 使用ArrayList實現一個Key對應一個ArrayList實現一對多
				flag++;
			}
			System.out.println("主播放列表的歌曲為:");
			Iterator it=p.playListMap.values().iterator();
			while(it.hasNext()) {
				Iterator it2=((List)(it.next())).iterator();
				while(it2.hasNext()) {
				System.out.println(it2.next());}
			}
			
		    
			Set<Entry<String, Object>> entrySet = p.playListMap.entrySet();
			// 列印輸出key-value的值 通過entrySet方法得到key-value
			for (Entry<String, Object> entry : entrySet) {
				// entry.getValue();
				// entry.getKey();
				System.out.println(entry.getKey() + "-" + entry.getValue());
				}
			new TestDemo().playListMenu();
		}

		/*
		 * 當state為false時,點選的是普通列表的操作
		 */
		System.out.println("輸入你要新增的列表名稱:");
		String s = sc.next();
		if (new PlayListCollection().playListMap.isEmpty())
			System.out.println("還沒建立列表");
		if (!new PlayListCollection().playListMap.containsKey(s))// 判斷是否存在此列表
		{
			System.out.println("列表不存在");
			new TestDemo().playListMenu();
		} else {

			System.out.println("輸入新增歌曲的數量:");
			int n = sc.nextInt();// 獲取歌曲的數量,從而做幾次迴圈
			int flag = 0;

			while (flag < n) {
				Song song1 = new Song();// 每次新建一個物件,讓Song的物件產生不同的id
				System.out.println("輸入第" + (flag + 1) + "首歌曲的id:");
				song1.setId(sc.next());
				System.out.println("輸入第" + (flag + 1) + "首歌曲的名稱:");
				song1.setName(sc.next());
				System.out.println("輸入第" + (flag + 1) + "首歌曲的演唱者:");
				song1.setSinger(sc.next());
				musicList.add(song1);
				((List) p.playListMap.get(s)).add(song1);// 使用ArrayList實現一個Key對應一個ArrayList實現一對多
				flag++;
			}
			System.out.println("普通列表的歌曲為");
			for (int i = 0; i < musicList.size(); i++)
			{   
				System.out.println(musicList.get(i));}

		}
		Set<Entry<String, Object>> entrySet = p.playListMap.entrySet();
		// 列印輸出key-value的值 通過entrySet方法得到key-value
		for (Entry<String, Object> entry : entrySet) {
			// entry.getValue();
			// entry.getKey();
			System.out.println(entry.getKey() + "-" + entry.getValue());

		}
		new TestDemo().playListMenu();
	}

	// 顯示播放列表中所有歌曲
	public void displayAllSong() {
		boolean flag=false;
		//使用KeySet()
		//1取得keySet
		Set<String> keySet=p.playListMap.keySet();
		//2遍歷keySet
		for(String key:keySet) {
			if("main".equals(key)) {
				flag=true;
				System.out.println("主播放列表歌曲為");
				Iterator it2=((List)(p.playListMap.get(key))).iterator();
				while(it2.hasNext()) {
				System.out.println(it2.next());}
				break;
			}
			
			Set<Entry<String, Object>> entrySet = p.playListMap.entrySet();
			// 列印輸出key-value的值 通過entrySet方法得到key-value
				for (Entry<String, Object> entry : entrySet) {
							// entry.getValue();
							// entry.getKey();
							//System.out.println(entry.getKey() + "-" + entry.getValue());
			           //	System.out.println(entry.getKey());//獲取key的值
						
			//2遍歷keySet
			for(String key2:keySet) {
				if(entry.getKey().equals(key)) {
					flag=true;
					System.out.println("普通播放列表歌曲為");
					Iterator it2=((List)(p.playListMap.get(entry.getKey()))).iterator();
					while(it2.hasNext()) {
				   System.out.println(((Song)(it2.next())));
					//System.out.println(it2.next());
					}
					break;
				}}}
			
			
			}}
			 

	// 通過id查詢歌曲
	public Song searchSongById(String id) {
		Scanner sc=new Scanner(System.in);
		System.out.println("輸入你要搜尋的歌曲id");
		String searchId=sc.next();
		Song song=new Song();
		boolean flag=false;
		//通過entrySet方法得到key-value
		Set<Entry<String, Object>> entrySet = p.playListMap.entrySet();
		// 列印輸出key-value的值 通過entrySet方法得到key-value
			for (Entry<String, Object> entry : entrySet) {
				
		Set<String> keySet=p.playListMap.keySet();
		//List的遍歷,通過get(key)得到value因為value是List所以強轉換成List型別。再用List遍歷
		Iterator it2=((List)(p.playListMap.get(entry.getKey()))).iterator();
		while(it2.hasNext()){
	    song=(Song)it2.next();//將找到的資料轉換成song,如果滿足與輸入結果相同,則返回這個結果
	    if(song.getId().equals(searchId)) {
	    	flag=true;
	    	System.out.println(song);
	    	break;
	    }
			}}
			if(flag)
		System.out.println("搜尋成功");
			
			else {
				System.out.println("無此歌曲id");
			}

		return song;
		
		

	}

	// 通過名稱查詢歌曲
	public Song searchSongByName(String name) {
		Scanner sc=new Scanner(System.in);
		System.out.println("輸入你要搜尋的歌曲名稱");
		String searchName=sc.next();
		Song song=new Song();
		boolean flag=false;
		//通過entrySet方法得到key-value
		Set<Entry<String, Object>> entrySet = p.playListMap.entrySet();
		// 列印輸出key-value的值 通過entrySet方法得到key-value
			for (Entry<String, Object> entry : entrySet) {
				
		Set<String> keySet=p.playListMap.keySet();
		//List的遍歷,通過get(key)得到value因為value是List所以強轉換成List型別。再用List遍歷
		Iterator it2=((List)(p.playListMap.get(entry.getKey()))).iterator();
		while(it2.hasNext()){
	    song=(Song)it2.next();//將找到的資料轉換成song,如果滿足與輸入結果相同,則返回這個結果
	    if(song.getName().equals(searchName)) {
	    	flag=true;
	    	System.out.println(song);
	    	break;
	    }
			}}
			if(flag)
		System.out.println("搜尋成功");
			
			else {
				System.out.println("無此歌曲名稱");
			}

		return song;
	}

	// 修改歌曲
	public void updateSong(String id, Song song) {
		Scanner sc=new Scanner(System.in);
		System.out.println("輸入你要更新的歌曲id");
		String searchId=sc.next();
		song=new Song();
		boolean flag=false;
		//通過entrySet方法得到key-value
		Set<Entry<String, Object>> entrySet = p.playListMap.entrySet();
		// 列印輸出key-value的值 通過entrySet方法得到key-value
			for (Entry<String, Object> entry : entrySet) {
				
		Set<String> keySet=p.playListMap.keySet();
		//List的遍歷,通過get(key)得到value因為value是List所以強轉換成List型別。再用List遍歷
		Iterator it2=((List)(p.playListMap.get(entry.getKey()))).iterator();
		while(it2.hasNext()){
	    song=(Song)it2.next();//將找到的資料轉換成song,如果滿足與輸入結果相同,則返回這個結果
	    if(song.getId().equals(searchId)) {
	    	flag=true;
	    	((List)(p.playListMap.get(entry.getKey()))).remove(song);
	    	System.out.println("輸入你修改後的歌曲名稱");
	    	song.setName(sc.next());
	    	System.out.println("輸入你修改後的歌曲演唱者");
	    	song.setSinger(sc.next());
	    	System.out.println(song);
	    	break;
	    }
			}}
			if(flag)
		System.out.println("修改成功");
			
			else {
				System.out.println("無此歌曲id");
			}

		
	}
	public void outPut() {
		System.out.println("為輸入匯出的歌單命名");
		Scanner sc=new Scanner (System.in);
		//建立File檔案 song.txt
		File file=new File("/Users/mac/Documents/java/demo/",sc.next()+".txt");
		if(!file.exists()) {//判斷檔案是否存在
			System.out.println("建立成功");	
			try {
				file.createNewFile();
			PrintStream ps = System.out;//臨時存一下
			System.setOut(new PrintStream(file));//將system.out 的內容列印到.txt內
			this.displayAllSong();
			System.setOut(ps);//設定回標準輸入流
			new TestDemo().playListMenu();
			}
			 catch (FileNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				
			}
		}
		else {
			System.out.println("檔名已存在");	
			outPut();
		}
		
		
	}

	// 從播放列表刪除歌曲
	public void deleteSong(String id) {
		Scanner sc=new Scanner(System.in);
		System.out.println("輸入你要刪除的歌曲id");
		String searchId=sc.next();
		Song song=new Song();
		boolean flag=false;
		//通過entrySet方法得到key-value
		Set<Entry<String, Object>> entrySet = p.playListMap.entrySet();
		// 列印輸出key-value的值 通過entrySet方法得到key-value
			for (Entry<String, Object> entry : entrySet) {
				
		Set<String> keySet=p.playListMap.keySet();
		//List的遍歷,通過get(key)得到value因為value是List所以強轉換成List型別。再用List遍歷
		Iterator it2=((List)(p.playListMap.get(entry.getKey()))).iterator();
		while(it2.hasNext()){
	    song=(Song)it2.next();//將找到的資料轉換成song,如果滿足與輸入結果相同,則返回這個結果
	    if(song.getId().equals(searchId)) {
	    	flag=true;
	    	((List)(p.playListMap.get(entry.getKey()))).remove(song);
	    	break;
	    }
			}}
			if(flag)
		System.out.println("刪除歌曲成功");
			
			else {
				System.out.println("無此歌曲id");
			}

	}

}

PlayListCollection.java

package com.demo.homework;

import java.util.ArrayList;
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 {
	static Map<String,Object> playListMap=new HashMap<String,Object>();//存放播放列表的集合
    static List<Song> list=new ArrayList();

	
	
	//新增播放列表
	public void addPlayList(PlayList playList) {
		Scanner sc=new Scanner(System.in);
		String key=playList.setPlayListName(sc.next());
		List value=playList.getMusicList();
		playListMap.put(key, value);
		//sc.close();
		
		Set <Entry<String,Object>> entrySet=playListMap.entrySet();
		//列印輸出key-value的值 通過entrySet方法得到key-value
		for(Entry<String, Object> entry:entrySet) {
			//entry.getValue();
			//entry.getKey();
			System.out.println(entry.getKey()+"-"+entry.getValue());
			
		}
		

	}
	//刪除播放列表
	public void deletePlayList(PlayList playList) {
		Scanner sc=new Scanner(System.in);
		//通過輸入的列表名稱刪除播放列表
		System.out.println("輸入你要刪除的播放列表名稱");
		if(playListMap.containsKey(sc.next())) {//如果列表有這個名稱,則進行刪除操作
			playListMap.remove(sc.next());
			System.out.println("刪除列表成功");
		}
		else {
			System.out.println("無此播放列表");
		}
	
		
	}
	//通過名字查詢播放列表
	public PlayList searchPlayListByName(String PlayListname) {
		Scanner sc=new Scanner(System.in);
		System.out.println("輸入你查詢的播放列表名稱");
		String key=sc.next();
		//通過輸入的列表名稱刪除播放列表
		if(playListMap.containsKey(key)) {//如果列表有這個名稱,則進行刪除操作
			if(((List)(playListMap.get(key))).size()==0) //如果為空表
				{System.out.println("該列表為空");}
			else {
				System.out.println("查詢列表成功");
		System.out.println(playListMap.get(key));
			}
			
		}
		else {
			System.out.println("無此播放列表");
		}
		
		return null;
		
	}
	//顯示所有播放列表的名稱 
	public void displayPlayListName() {
		Set<Entry<String,Object>>entrySet=playListMap.entrySet();
		System.out.println("找到以下列表");
		for(Entry<String,Object>entry:entrySet) {
			System.out.println(entry.getKey());
		}
		
	}
	
	
}

TestDemo.java

package com.demo.homework;

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

public class TestDemo {
	 public static PlayListCollection p = new PlayListCollection();
	//測試歌曲類
	public void testSong() {
		
	}
	//測試播放列表類
	public void testPlayList() {
		
	}
	//測試播放器類
	public void testPlayListCollection() {
		
	}
	//主選單
	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("請輸入對應數字進行操作:");
	//從鍵盤中接受資料
	Scanner sc=new Scanner(System.in);
	while(!sc.hasNext("0")) {//掃描到0就退出迴圈
	int n=sc.nextInt();
    switch(n) {
    case 1:new TestDemo().playListMenu();break;//顯示播放器列表管理
    case 2:new TestDemo().playMenu();break;//播放器管理
    case 0:break;
    }
		
	}
	
	}
	//播放列表選單
	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("請輸入對應數字對播放列表進行操作:");
		//從鍵盤中接受資料
				Scanner sc=new Scanner(System.in);
				while(sc.hasNext()) {
				int n=sc.nextInt();
				PlayList playList=new PlayList();
				Song song=new Song();
			    switch(n) {//a無任何意義
			    case 1:playList.addToPlayList(song,true);break;//顯示播放器列表管理
			    case 2:playList.addToPlayList(song,false);break;//播放器管理
			    case 3:playList.searchSongById("a");break;//通過id找歌曲
			    case 4:playList.searchSongByName("a");break;//通過id找歌曲
			    case 5:playList.updateSong("a", song);;break;//通過名稱找歌曲
			    case 6:playList.deleteSong("a");;break;//通過id刪除歌曲
			    case 7:playList.displayAllSong();break;//顯示所有歌曲
			    case 8:playList.outPut();break;//匯出歌單,放到一個文字里面
			    case 9:mainMenu();break;//返回上一個
			    case 0:break;
			    }}
		
	}
	//播放器選單
	
	public void playMenu() {
			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("請輸入對應數字對播放器進行操作:");
			//從鍵盤中接受資料
			PlayList playList=new PlayList();
			Scanner sc=new Scanner(System.in);
			while(sc.hasNext()) {//掃描到0就退出迴圈
			int n=sc.nextInt();
		    switch(n) {
		    case 1:new PlayListCollection().addPlayList(new PlayList());break;//顯示播放器列表管理
		    case 2:new PlayListCollection().deletePlayList(playList);break;//通過名稱刪除播放列表
		    case 3:new PlayListCollection().searchPlayListByName("a");break;//通過名稱顯示播放列表
		    case 4:new PlayListCollection().displayPlayListName();break;//顯示所以播放列表
		    case 9:new TestDemo().playListMenu();break;//播放器管理
		    case 0:break;
		    }
				
			}
			
		
	}
	
	

	public static void main(String[] args) {
		String key="main";
		List value=new PlayList().getMainList();
		p.playListMap.put(key, value);
		new TestDemo().mainMenu();


	}

}

 

相關文章