6.2 集合和映射--集合Set->底層基於鏈表實現

在6.1中咱們實現了底層基於二叉搜索樹的集合,本節就底層如何基於鏈表實現進行學習,注意:此處的鏈表是以前本身封裝的.html

一、集合set相關功能

1.1 add()的不一樣

用於鏈表自己沒有去重的效果,所以咱們在作基於鏈表的集合時,須要對add()方法作一下特殊處理,以下增長一個判斷便可。java

 @Override
    public void add(E e) {
        if (!list.contains(e)) {
            list.addFirst(e);
        }
    }

2.集合實現

2.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

public class LinkedListSet<E> implements Set<E> {

    private LinkedList<E> list;


    public LinkedListSet() {
        list = new LinkedList<E>();
    }


    @Override
    public int getSize() {
        return list.getSize();
    }

    @Override
    public boolean isEmpty() {
        return list.isEmpty();
    }

    @Override
    public boolean contains(E e) {
        return list.contains(e);
    }

    @Override
    public void add(E e) {
        if (!list.contains(e)) {
            list.addFirst(e);
        }
    }


    @Override
    public void remove(E e) {
        list.removeElement(e);
    }
}

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

import java.util.ArrayList;

public class LinkedListSetTestDemo {
    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());

        LinkedListSet<String> set1 = new LinkedListSet<>();
        //加強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());

        LinkedListSet<String> set2 = new LinkedListSet<>();
        //加強for循環,定一個字符串word去遍歷words
        //底層的話會把ArrayList words1中的值一個一個的賦值給word
        for (String word : words2)
            set2.add(word);//不添加劇復元素
        System.out.println("Total  different words : " + set2.getSize());

    }
}

結果:git

 

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

 

在下一下節,將對本節即6.1節相關的進行分析【基於二分搜索樹、鏈表的實現的集合Set複雜度分析】ide

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

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

相關文章
相關標籤/搜索