使用List实现Set

时间:2013-01-15 11:28:21

标签: java collections

如何实现我自己的List,不允许重复元素使用ArrayListLinkedList设置?

让我们假设

 public class  MyList<E> extends AbstractList<E>{

//add
//addAll
//remove
//get
//size

}

3 个答案:

答案 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 ...感。