2012-10-11 90 views
0
  1. 有没有更好的方法来添加一个列表到另一个现有的列表比我在编写的add方法?
  2. 是从播放列表中删除歌曲列表的方式是否正确,或者我是否会遇到并发修改异常?Java集合操作

    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); 
    } 
    
    
    } 
    
+0

我在构造函数中创建playList = new ArrayList ..所以我不会有null ptr异常。 – Phoenix

回答

2

从一个列表的所有元素添加到另一个,使用;

List.addAll

追加所有指定集合中的元素来的 结束此列表,在他们被指定 collection的迭代

要删除所有返回的顺序一个列表中的元素来自另一个列表;

List.removeAll

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

+0

好的。但是我编码的方式呢?集合API是否也使用相同的东西? – Phoenix

+1

@Phoenix你可以确定它比你做得更好。 – Jagger

+0

我不是在质疑。但想知道,因为这是迭代的列表修改它会导致concdrent修改异常 – Phoenix

1

使用addAll()removeAll()方法:

playList.addAll(songs); 

playList.removeAll(songs); 
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); 
} 


} 
2

关于你的removeSongs

版本,但由于这不知道是该名单的修改而迭代它确实是导致concrrent修改例外

假设名单标准列表类的实例,你的代码不应该抛出CME。

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

但是,如果一些其他的代码被同时使用此代码,其他代码可能它使用迭代器的下一次拿到CME迭代playlist。同样,如果其他代码修改songs而您的代码正在迭代它,那么这个代码可能会抛出一个CME。 (您需要查看代码的其余部分以确定是否可能出现这两种情况。)