Java如何跨类检查AlbumsList中指定专辑及对应歌曲是否存在
解决思路
你不需要在Playlist类中维护专辑集合,只需要补全AlbumsList的查询能力,调用时传入全局的AlbumsList实例做校验即可,具体修改如下:
第一步:补全AlbumsList类的查询方法
先给AlbumsList增加按专辑名查找专辑、按专辑+歌曲名校验歌曲存在性的方法:
import java.util.ArrayList; public class AlbumsList { private ArrayList<Album> albumsList = new ArrayList<>(); public AlbumsList(String album) { this.albumsList.add(Album.newAlbum(album)); } public void addAlbum (String album){ this.albumsList.add(Album.newAlbum(album)); } // 新增:根据专辑名查找对应专辑实例 public Album findAlbumByName(String albumName) { for (Album album : albumsList) { if (album.getAlbumName().equals(albumName)) { return album; } } return null; } // 新增:校验指定专辑中是否存在目标歌曲 public Song findSongFromAlbum(String albumName, String songTitle) { Album targetAlbum = findAlbumByName(albumName); if (targetAlbum == null) { return null; } for (Song song : targetAlbum.getSongsList()) { if (song.getSongTitle().equals(songTitle)) { return song; } } return null; } }
第二步:修改Playlist的addSong方法
将AlbumsList实例作为方法入参传入,不需要在Playlist类中定义全局的专辑集合,完全符合你的要求:
import java.util.LinkedList; public class PlayList { private String playlistName; private LinkedList<Song> songsInPlaylist = new LinkedList<>(); public PlayList(String playlistName) { this.playlistName = playlistName; } public void addSong(AlbumsList globalAlbumsList, String albumName, String songTitle){ // 先校验歌曲是否存在 Song targetSong = globalAlbumsList.findSongFromAlbum(albumName, songTitle); if (targetSong == null) { System.out.println("添加失败:指定专辑不存在或专辑中无对应歌曲"); return; } // 校验通过,添加到播放列表 songsInPlaylist.add(targetSong); System.out.println("已成功添加歌曲:" + songTitle); } // 可选:补充播放列表的展示方法 public void displayPlaylist() { System.out.println("播放列表:" + playlistName); for (Song song : songsInPlaylist) { System.out.println(song); } } }
调用示例
public class Main { public static void main(String[] args) { // 初始化全局专辑列表 AlbumsList myAlbums = new AlbumsList("周杰伦-范特西"); // 给专辑加歌曲 myAlbums.findAlbumByName("周杰伦-范特西").addSong("双截棍", 214); myAlbums.findAlbumByName("周杰伦-范特西").addSong("晴天", 273); // 初始化播放列表 PlayList myFavorites = new PlayList("我喜欢的歌"); // 添加歌曲,传入全局专辑列表实例 myFavorites.addSong(myAlbums, "周杰伦-范特西", "晴天"); myFavorites.addSong(myAlbums, "周杰伦-范特西", "不存在的歌"); // 会提示添加失败 myFavorites.displayPlaylist(); } }
可选优化:单例模式适配全局唯一专辑列表
如果你的整个项目中只有一个统一的专辑列表,也可以把AlbumsList改成单例模式,就不需要每次调用addSong时都传实例:
public class AlbumsList { private static AlbumsList instance; private ArrayList<Album> albumsList = new ArrayList<>(); // 构造方法私有,禁止外部直接实例化 private AlbumsList() {} // 全局唯一获取实例的入口 public static AlbumsList getInstance() { if (instance == null) { instance = new AlbumsList(); } return instance; } // 剩下的addAlbum、findAlbumByName等方法和之前一致 public void addAlbum (String album){ this.albumsList.add(Album.newAlbum(album)); } public Album findAlbumByName(String albumName) { for (Album album : albumsList) { if (album.getAlbumName().equals(albumName)) { return album; } } return null; } public Song findSongFromAlbum(String albumName, String songTitle) { Album targetAlbum = findAlbumByName(albumName); if (targetAlbum == null) { return null; } for (Song song : targetAlbum.getSongsList()) { if (song.getSongTitle().equals(songTitle)) { return song; } } return null; } }
单例模式下Playlist的addSong方法可以简化为:
public void addSong(String albumName, String songTitle){ AlbumsList globalAlbumsList = AlbumsList.getInstance(); Song targetSong = globalAlbumsList.findSongFromAlbum(albumName, songTitle); if (targetSong == null) { System.out.println("添加失败:指定专辑不存在或专辑中无对应歌曲"); return; } songsInPlaylist.add(targetSong); }
内容的提问来源于stack exchange,提问作者krishnaacharyaa
相关产品推荐
相关产品推荐

