0
  1. 有没有比我在 add 方法中编码的更好的方法将列表添加到另一个现有列表?
  2. 从播放列表中删除歌曲列表的方法是否正确,还是我会遇到并发修改异常?

    class Playlist
    {
    List<Song> playList;
    public void addSongs(List<Song> songs)
    {
      for(Song s:songs)
      playList.add(s);
    }
    
    public void removeSongs(List<Song> songs)
    {
      for(Song s:songs)
      if(playList.contains(s))
      playList.remove(s);
    }
    
    
    }
    
4

4 回答 4

2

要将一个列表中的所有元素添加到另一个列表中,请使用;

List.addAll

将指定集合中的所有元素附加到此列表的末尾,按照指定集合的​​迭代器返回的顺序

从另一个用途中删除一个列表中的所有元素;

List.removeAll

从此列表中删除指定集合中包含的所有元素

于 2012-10-11T01:48:42.843 回答
2

参考您的版本removeSongs

但是想知道,因为这是在迭代列表时对列表的修改,它是否会导致并发修改异常

假设列表是标准列表类的实例,您的代码不应抛出 CME。

如果您在迭代集合时修改集合(除了您使用Iterator.remove()...时),通常会抛出 CME。您的代码正在迭代songs和修改playlist. 这不会导致显示的代码中出现 CME。

但是,如果其他代码playlist与此代码同时迭代,则其他代码可能会在下次使用其迭代器时获得 CME。同样,如果在您的代码迭代时修改了其他代码songs,则代码可能会引发 CME。(您需要查看其余代码以确定是否可能出现这些情况。)

于 2012-10-11T02:07:16.257 回答
1

使用addAll()removeAll()方法:

playList.addAll(songs);

playList.removeAll(songs);
于 2012-10-11T01:48:14.543 回答
0

实例化你的List

class Playlist
{
List<Song> playList;
public Playlist(){
 playList = new ArrayList<Song>();
}

这里不需要循环。改为使用addAll

public void addSongs(List<Song> songs)
{
  playList.addAll(songs);
}

您在这里也不需要循环。改为使用removeAll

public void removeSongs(List<Song> songs)
{
  playList.removeAll(songs);
}


}
于 2012-10-11T01:50:55.900 回答