如何实现我自己的List,不允许重复元素使用ArrayList
或LinkedList
设置?
让我们假设
public class MyList<E> extends AbstractList<E>{
//add
//addAll
//remove
//get
//size
}
答案 0 :(得分:3)
@override
public boolean add(..<E>)
{
//implement code to reject duplicates
// returns **false** if object already present in the list
}
答案 1 :(得分:1)
您应该尝试使用LinkedHashSet
代替MyList
答案 2 :(得分:1)
严格地说,如果不违反List
合同,你就不能这样做。
假设你有:
public class MyList<E> extends AbstractList<E>{
...
}
您正在扩展AbstractList
这一事实意味着您间接实施List
。这意味着某些操作必须以特定方式运行。例如,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 ...
}
顺便说一句,如果你对javadocs应用一个迂腐和无意义的读数,List.add(E)
操作的返回值的规范只是一个问题。 List
javadoc明确允许拒绝添加特定元素的列表实现。我的看法是短语“true(由Collection.add(E)指定)”适用于add操作实际更改列表的情况。如果它没有更改列表,Collection.add(E)
方法规范实际表示结果 应该是false
...感。