1. 程式人生 > >6.2 集合和映射--集合Set->底層基於鏈表實現

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

clas 名著 pty ctu 我們 不用 pub .cn first

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

1、集合set相關功能

技術分享圖片

1.1 add()的不同

用於鏈表本身沒有去重的效果,因此我們在做基於鏈表的集合時,需要對add()方法做一下特殊處理,如下增加一個判斷即可。

 @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());

    }
}

結果:

技術分享圖片

這裏需要說明一下就是關於我們統計的單詞數只考慮了每個單詞組成的不用,並沒有對單詞的特殊形式做區分。

源碼地址 https://github.com/FelixBin/dataStructure/tree/master/src/SetAndMap

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

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