(一) 定义
承载元素的一个容器, 容器中的元素无序且唯一(不重复). 实现集合的方式多种多样, 在JAVA语言表现中, 会将集合定义成一个接口, 提供集合对应的操作的抽象方法.
/**
* 自定义集合抽象类Set
*
* @author Administrator
*
*/
public interface Set<E> {
/**
* 向集合中添加元素e, 集合元素不重复
*
* @param e
*/
void add(E e);
/**
* 从集合中删除元素e
*
* @param e
*/
void remove(E e);
/**
* 集合是否包含元素e
*
* @param e
* @return
*/
boolean contains(E e);
/**
* 集合的元素个数
*
* @return
*/
int getSize();
/**
* 集合是否为空
*
* @return
*/
boolean isEmpty();
}
(二) 自定义集合
1.基于二分搜索树的集合实现
public class BSTSet<E extends Comparable<E>> implements Set<E> {
private BinarySearchTree<E> bst;
public BSTSet() {
bst = new BinarySearchTree<>();
}
@Override
public void add(E e) {
bst.add(e);
}
@Override
public void remove(E e) {
bst.remove(e);
}
@Override
public boolean contains(E e) {
return bst.contains(e);
}
@Override
public int getSize() {
return bst.size();
}
@Override
public boolean isEmpty() {
return bst.isEmpty();
}
}
2.基于链表的集合实现
public class LinkedListSet<E> implements Set<E> {
private LinkedList<E> list;
public LinkedListSet() {
list = new LinkedList<>();
}
@Override
public void add(E e) {
// 判断添加元素是否重复
if (!list.contains(e)) {
list.addFirst(e);
}
}
@Override
public void remove(E e) {
list.removeElemet(e);
}
@Override
public boolean contains(E e) {
return list.contains(e);
}
@Override
public int getSize() {
return list.getSize();
}
@Override
public boolean isEmpty() {
return list.isEmpty();
}
}
(三) 时间复杂度分析
add(e)方法为了保证集合存储的元素不重复, 内部调用了contain(e) 方法
LinkedListSet | BSTSet | 平均 | 最差(链表) | |
---|---|---|---|---|
add(e) | O(n) | O(h) | O(logn) | O(n) |
remove(e) | O(n) | O(h) | O(logn) | O(n) |
contains(e) | O(n) | O(h) | O(logn) | O(n) |