集合(Set)
集合特性
- 元素不重複
利用二分搜尋樹實現集合
更具上面的特性, 集合中是不包含重複元素的, 而我們上一章(bst)學習的二分搜尋樹恰好就是一個不包含重複元素的樹結構
我們可以利用二分搜尋樹作為集合的底層實現結構。
我們先來看看集合介面的幾個方法把。
public interface Set<E> {
void add(E e); // 新增元素
void remove(E e); // 刪除元素
boolean contains(E e); // 是否包含元素
int getSize(); // 集合大小
boolean isEmpty(); // 集合是否為空
}
複製程式碼
建立一個實現該介面的類
/**
* 基於二分搜尋樹的集合類
*/
public class BSTSet<E extends Comparable<E>> implements Set<E> {
private BST<E> bst;
public BSTSet() {
this.bst = new BST<>();
}
@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();
}
}
複製程式碼
這裡可以看到, 所有的操作都是通過二分搜尋樹來實現的。
通過下面程式, 進行一個簡單測試
public class BSTSetTest {
public static void main(String[] args) {
Set<Integer> set = new BSTSet<>();
set.add(1);
set.add(2);
set.add(3);
set.add(4);
set.add(5);
set.add(1);
set.add(1);
set.add(1);
set.add(2);
System.out.println(set.getSize());
set.remove(2);
System.out.println(set.getSize());
System.out.println(set.contains(11));
}
}
複製程式碼
基於連結串列實現集合
這裡使用的是我們在學習連結串列時候的累, 但是需要擴充套件一個方法, 之前沒有刪除元素的方法, 現在新增一個.
// linkedlist.java
// 從連結串列中刪除元素
public void removeElement(E e) {
Node prev = dummyHead;
while (prev.next != null) {
if (prev.next.e.equals(e)) {
break;
}
prev = prev.next;
}
if (prev.next != null) {
Node delNode = prev.next;
prev.next = delNode.next;
delNode.next = null;
size -- ;
}
}
複製程式碼
public class LinkedListSet<E> implements Set<E> {
private LinkedList<E> list;
public LinkedListSet() {
this.list = new LinkedList<>();
}
@Override
public void add(E e) {
if (!list.contains(e)) {
// 如果不包含元素則進行新增
list.addFirst(e);
}
}
@Override
public void remove(E e) {
list.removeElement(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();
}
}
複製程式碼
測試方法
public static void main(String[] args) {
Set<Integer> set = new LinkedListSet<>();
set.add(1);
set.add(2);
set.add(3);
set.add(2);
set.add(1);
set.add(3);
set.add(3);
set.add(3);
System.out.println(set.getSize());
set.remove(2);
System.out.println(set.getSize());
}
複製程式碼