- add メソッドでコーディングした方法よりも、リストを別の既存のリストに追加するより良い方法はありますか?
プレイリストから曲のリストを削除する方法は正しいですか、それとも同時変更の例外が発生しますか?
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 に答える
あるリストから別のリストにすべての要素を追加するには、次を使用します。
指定されたコレクションのすべての要素を、指定されたコレクションの反復子によって返される順序で、このリストの末尾に追加します
あるリストからすべての要素を別のリストから削除するには;
指定されたコレクションに含まれるすべての要素をこのリストから削除します
あなたのバージョンを参照してremoveSongs
しかし、これは反復中のリストの変更であるため、同時変更例外が発生するのではないかと考えています
リストが標準のリスト クラスのインスタンスであると仮定すると、コードは CME をスローするべきではありません。
コレクションの反復中にコレクションを変更すると、通常、CME がスローされます (... を使用する場合を除くIterator.remove()
)。あなたのコードは反復songs
と変更を行ってplaylist
います。これにより、示されているコードで CME が発生することはありません。
ただし、他のコードがこのコードと同時に反復している場合、playlist
その他のコードが次にその反復子を使用するときに CME を取得する可能性があります。同様に、コードの反復中に他のコードが変更された場合、このコードは CME をスローする可能性があります。(これらのシナリオのいずれかが可能かどうかを判断するには、残りのコードを調べる必要があります。)songs
addAll()
メソッドと removeAll()
メソッドを使用します。
playList.addAll(songs);
playList.removeAll(songs);
インスタンス化する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);
}
}