You need to enable JavaScript to run this app. Java如何跨类检查AlbumsList中指定专辑及对应歌曲是否存在
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 22:36:06