6.1 集合和映射--集合Set->底層基於二叉搜索樹實現

前言:在第5章的系列學習中,已經實現了關於二叉搜索樹的相關操做,詳情查看第5章便可。在本節中着重學習使用底層是咱們已經封裝好的二叉搜索樹相關操做來實現一個基本的集合(set)這種數據結構。
集合set的特性:
集合Set存儲的元素是無序的、不可重複的。爲了能達到這種特性就須要尋找能夠做爲支撐的底層數據結構。
這裏選用以前本身實現的二叉搜索樹,這是因爲該二叉樹是不能盛放重複元素的。所以咱們可使用二叉搜索樹這種底層來實現集合(set)。html

一、集合set相關功能

1.1 add()方法特性

二分搜索樹的添加操做add:不能盛放重複元素git

2. set應用

典型應用:1.客戶統計 2.詞彙量統計github

3.集合實現

3.1 Set接口定義

/**
 * 集合的接口
 */
public interface Set<E> {
    void add(E e);//添加  <——<不能添加劇復元素
    void remove(E e);//移除
    int  getSize();//獲取大小
    boolean isEmpty();//是否爲空
    boolean contains(E e);//是否包含元素
    
}

3.2 基於二分搜索樹實現集合Set

//基於BST二分搜索樹實現的集合Set
public class BSTSet<E extends Comparable<E>> implements Set<E> {//元素E必須知足可比較的
 
    //基於BST類的對象
    private BST<E> bst;
 
    //構造函數
    public BSTSet() {
        bst = new BST<>();
    }
 
    //返回集合大小
    @Override
    public int getSize() {
        return bst.size();
    }
 
    //返回集合是否爲空
    @Override
    public boolean isEmpty() {
        return bst.isEmpty();
    }
 
    //Set添加元素
    @Override
    public void add(E e) {
        bst.add(e);
    }
 
    //是否包含元素
    @Override
    public boolean contains(E e) {
        return bst.contains(e);
    }
 
    //移除元素
    @Override
    public void remove(E e) {
        bst.remove(e);
    }
}

3.3測試:兩本名著的詞彙量 和不重複的詞彙量

public static void main(String[] args) {
 
        System.out.println("Pride and Prejudice");
        //新建一個ArrayList存放單詞
        ArrayList<String> words1=new ArrayList<>();
        //經過這個方法將書中因此單詞存入word1中
        FileOperation.readFile("pride-and-prejudice.txt",words1);
        System.out.println("Total words : "+words1.size());
 
        BSTSet<String> set1=new BSTSet<>();
        //加強for循環,定一個字符串word去遍歷words
        //底層的話會把ArrayList words1中的值一個一個的賦值給word
        for(String word:words1)
            set1.add(word);//不添加劇復元素
        System.out.println("Total  different words : "+set1.getSize());
 
        System.out.println("-------------------");
        System.out.println("Pride and Prejudice");
        //新建一個ArrayList存放單詞
        ArrayList<String> words2=new ArrayList<>();
        //經過這個方法將書中因此單詞存入word1中
        FileOperation.readFile("a-tale-of-two-cities.txt",words2);
        System.out.println("Total words : "+words2.size());
 
        BSTSet<String> set2=new BSTSet<>();
        //加強for循環,定一個字符串word去遍歷words
        //底層的話會把ArrayList words1中的值一個一個的賦值給word
        for(String word:words2)
            set2.add(word);//不添加劇復元素
        System.out.println("Total  different words : "+set2.getSize());
    }

結果:數據結構

這裏須要說明一下就是關於咱們統計的單詞數只考慮了每一個單詞組成的不用,並無對單詞的特殊形式作區分。ide

 

在下一小節中繼續學習【集合和映射--集合Set->底層基於鏈表實現】函數

 

源碼地址 https://github.com/FelixBin/dataStructure/tree/master/src/SetPart學習

 

推薦是最好的支持,關注是最大的鼓勵。親愛的朋友,很榮幸在園子裏遇到您。測試

相關文章
相關標籤/搜索