ArrayList
Set usingやのような重複要素を許可しない独自のリストを実装するにはどうすればよいLinkedList
ですか?
仮定しましょう
public class MyList<E> extends AbstractList<E>{
//add
//addAll
//remove
//get
//size
}
ArrayList
Set usingやのような重複要素を許可しない独自のリストを実装するにはどうすればよいLinkedList
ですか?
仮定しましょう
public class MyList<E> extends AbstractList<E>{
//add
//addAll
//remove
//get
//size
}
@override
public boolean add(..<E>)
{
//implement code to reject duplicates
// returns **false** if object already present in the list
}
LinkedHashSet
代わりに使用してみてくださいMyList
List
厳密に言えば、契約を破らずにそれを行うことはできません。
あなたが持っているとしましょう:
public class MyList<E> extends AbstractList<E>{
...
}
拡張AbstractList
しているということは、間接的に実装していることを意味しますList
。そしてこれは、特定の操作が特定の方法で動作する必要があることを意味します。たとえば、「指定されたオブジェクトがリストでもあり、両方のリストのサイズが同じで、2つのリストの対応する要素のペアがすべて等しいList.equals()
場合にのみtrueを返します。」として指定されます。 しかし、それはセットにとって、そして確かに。にとっては完全に間違ったセマンティクスです。真のセットでは、要素の順序は平等とは無関係です。Set
今、あなたはこれを無視することができます(プログラムは悪化します)...しかし、それがあなたを噛む可能性があります。
とにかく、リストを使用したセットのより意味的に正しい実装は、次のようになります。
public class MySet<E> implements Set<E> {
private List<E> list = ...
// implement the Set API by delegating to the list object ...
}
Incidentally, the spec of the List.add(E)
operation's return value only a problem if you apply a pedantic and nonsensical reading to the javadocs. The List
javadoc explicitly allows list implementations that refuse to add specific elements. My take is that the phrase "true (as specified by Collection.add(E))" is applies to the case where the add operation actually changes the list. If it doesn't change the list, the Collection.add(E)
method spec actually says that the result should be false
... and so does common sense.