成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Java知識(shí)點(diǎn)總結(jié)(Java容器-TreeSet)

codergarden / 2108人閱讀

摘要:知識(shí)點(diǎn)總結(jié)容器知識(shí)點(diǎn)總結(jié)容器是接口的唯一實(shí)現(xiàn),可以確保集合元素處于排序狀態(tài),底層是一棵排序樹(shù)。底層使用紅黑樹(shù)算法進(jìn)行維護(hù),因此性能相對(duì)于來(lái)說(shuō)要差一些,因?yàn)閮?nèi)部會(huì)自動(dòng)進(jìn)行排序操作。

Java知識(shí)點(diǎn)總結(jié)(Java容器-TreeSet)

@(Java知識(shí)點(diǎn)總結(jié))[Java, Java容器, JavaCollection, JavaSet]

TreeSet

TreeSet是SortedSet接口的唯一實(shí)現(xiàn),TreeSet可以確保集合元素處于排序狀態(tài),底層是一棵排序樹(shù)。

底層使用紅黑樹(shù)算法進(jìn)行維護(hù),因此性能相對(duì)于HashSet來(lái)說(shuō)要差一些,因?yàn)閮?nèi)部會(huì)自動(dòng)進(jìn)行排序操作。

TreeSet也是線程不安全

排序分為自然排序,定制排序,自然排序是TreeSet內(nèi)部對(duì)add進(jìn)來(lái)的值進(jìn)行排序,定制排序是對(duì)排序條件的限制

手動(dòng)實(shí)現(xiàn)TreeSet
package mySet;  
  
import java.util.Comparator;  
import java.util.Iterator;  
import java.util.NoSuchElementException;  
  
/** 
 * 實(shí)現(xiàn)一個(gè)簡(jiǎn)單的TreeSet 
 * @author george 
 */  
public class MyTreeSet implements Cloneable, java.io.Serializable {  
    // 為set底層樹(shù)的結(jié)構(gòu)排序用的比較器 當(dāng)按照E的自然排序時(shí)為null  
    private final Comparator comparator;  
    // 頭節(jié)點(diǎn)  
    private transient SetNode root = null;  
    // 節(jié)點(diǎn)個(gè)數(shù)  
    private transient int size = 0;  
  
    /** 
     * 無(wú)參構(gòu)造,設(shè)置比較器為null 
     */  
    public MyTreeSet() {  
        comparator = null;  
    }  
  
    /** 
     * 構(gòu)造函數(shù),傳入定義好的比較器對(duì)象 
     *  
     * @param comparator 
     *            :比較器對(duì)象 
     */  
    public MyTreeSet(Comparator comparator) {  
        this.comparator = comparator;  
    }  
  
    /** 
     * 插入對(duì)象e到MyTreeSet中 
     *  
     * @param e 
     *            :要插入的對(duì)象 
     * @return:返回是否插入成功 
     */  
    public boolean add(E e) {  
        SetNode n = root;  
        if (n == null) {  
            root = new SetNode(e, null);  
            size = 1;  
            return true;  
        }  
        int comp;  
        SetNode parents;  
        Comparator cptor = comparator;  
        // 若比較器不為空 用Comparator進(jìn)行比較  
        if (cptor != null) {  
            do {  
                parents = n;  
                comp = cptor.compare(e, n.e);  
                if (comp < 0)  
                    n = n.left;  
                else if (comp > 0)  
                    n = n.right;  
                else {  
                    return false;  
                }  
            } while (n != null);  
        } else {  
            if (e == null)  
                throw new NullPointerException();  
            // 用定義好的自然順序方法進(jìn)行排序比較  
            Comparable cpb = (Comparable) e;  
            do {  
                parents = n;  
                comp = cpb.compareTo(n.e);  
                if (comp < 0)  
                    n = n.left;  
                else if (comp > 0)  
                    n = n.right;  
                else {  
                    return false;  
                }  
            } while (n != null);  
        }  
        // 找到新元素將來(lái)位置的父結(jié)點(diǎn)后,將元素實(shí)例化成結(jié)點(diǎn)插入到樹(shù)中  
        SetNode newNode = new SetNode(e, parents);  
        if (comp < 0)  
            parents.left = newNode;  
        else  
            parents.right = newNode;  
        size++;  
        return true;  
    }  
  
    /** 
     * 返回是否含有元素e 
     *  
     * @param e 
     * @return 
     */  
    public boolean contains(E e) {  
        return getNode(e) != null;  
    }  
  
    /** 
     * 刪除元素e所在的結(jié)點(diǎn) 
     *  
     * @param e 
     * @return 
     */  
    public boolean remove(E e) {  
        SetNode node = getNode(e);// 找到元素e所在節(jié)點(diǎn)  
        if (node == null)  
            return false;  
        deleteNode(node);// 進(jìn)行刪除  
        return true;  
    }  
  
    /** 
     * 找到元素e在樹(shù)中的結(jié)點(diǎn) 
     *  
     * @param e 
     * @return 
     */  
    private SetNode getNode(E e) {  
        SetNode n = root;  
        int comp;  
        SetNode parents;  
        Comparator cptor = comparator;  
        // 若比較器不為空 用Comparator進(jìn)行比較  
        if (cptor != null) {  
            do {  
                parents = n;  
                comp = cptor.compare(e, n.e);  
                if (comp < 0)  
                    n = n.left;  
                else if (comp > 0)  
                    n = n.right;  
                else {  
                    return parents;  
                }  
            } while (n != null);  
        } else {  
            if (e == null)  
                throw new NullPointerException();  
            // 用定義好的自然順序方法進(jìn)行排序比較  
            Comparable cpb = (Comparable) e;  
            do {  
                parents = n;  
                comp = cpb.compareTo(n.e);  
                if (comp < 0)  
                    n = n.left;  
                else if (comp > 0)  
                    n = n.right;  
                else {  
                    return parents;  
                }  
            } while (n != null);  
        }  
        return null;  
    }  
  
    /** 
     * 刪除樹(shù)中的節(jié)點(diǎn)node 當(dāng)結(jié)點(diǎn)node有左右子女時(shí),往下所搜與node中的元素最為接近的元素的結(jié)點(diǎn) 
     * 找到后將該結(jié)點(diǎn)的元素值賦給node,讓node指向該結(jié)點(diǎn), 接下來(lái)刪除這個(gè)結(jié)點(diǎn)。 注意:最后要去掉的節(jié)點(diǎn)的子女個(gè)數(shù)都是小于2的 
     *  
     * @param node 
     */  
    void deleteNode(SetNode node) {  
        size--;  
        SetNode rep;  
        if (node.left != null && node.right != null) {  
            rep = replaceNode(node);  
            node.e = rep.e;  
            node = rep;  
        }  
        rep = (node.left != null ? node.left : node.right);  
  
        if (rep != null) {  
            rep.parents = node.parents;  
            if (node.parents == null)  
                root = rep;  
            else if (node == node.parents.left)  
                node.parents.left = rep;  
            else if (node == node.parents.right)  
                node.parents.right = rep;  
        } else {  
            if (node.parents == null) {  
                root = null;  
            }  
            if (node.parents != null) {  
                if (node == node.parents.left)  
                    node.parents.left = null;  
                else if (node == node.parents.right)  
                    node.parents.right = null;  
            }  
        }  
    }  
  
    /** 
     * 找到距離node中的元素大小最近的結(jié)點(diǎn) 
     *  
     * @param node 
     * @return 
     */  
    SetNode replaceNode(SetNode node) {  
        if (node == null)  
            return null;  
        else if (node.right != null) {  
            SetNode p = node.right;  
            while (p.left != null)  
                p = p.left;  
            return p;  
        } else {  
            SetNode p = node.parents;  
            SetNode ch = node;  
            while (p != null && ch == p.right) {  
                ch = p;  
                p = p.parents;  
            }  
            return p;  
        }  
    }  
  
    /** 
     * 清空set集合 
     */  
    public void clear() {  
        size = 0;  
        root = null;  
    }  
  
    /** 
     * 返回結(jié)點(diǎn)的個(gè)數(shù) 
     *  
     * @return 
     */  
    public int size() {  
        return size;  
    }  
  
    /** 
     * 找到最小的元素 
     *  
     * @return 
     */  
    public E first() {  
        SetNode p = root;  
        if (p != null)  
            while (p.left != null)  
                p = p.left;  
        if (p.e == null)  
            throw new NoSuchElementException();  
        else  
            return p.e;  
    }  
  
    /** 
     * 找到最大的元素 
     *  
     * @return 
     */  
    public E last() {  
        SetNode p = root;  
        if (p != null)  
            while (p.right != null)  
                p = p.right;  
        if (p.e == null)  
            throw new NoSuchElementException();  
        else  
            return p.e;  
    }  
  
    /** 
     * 找到最小的元素所在的結(jié)點(diǎn) 
     *  
     * @return 
     */  
    public SetNode firstNode() {  
        SetNode p = root;  
        if (p != null)  
            while (p.left != null)  
                p = p.left;  
        if (p.e == null)  
            throw new NoSuchElementException();  
        else  
            return p;  
    }  
  
    /** 
     * 迭代器 
     * @return 
     */  
    public Iterator iterator() {  
        return new KeyIterator(firstNode(), this);  
    }  
}  

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/69630.html

相關(guān)文章

  • Java識(shí)點(diǎn)總結(jié)Java容器-Set)

    摘要:知識(shí)點(diǎn)總結(jié)容器知識(shí)點(diǎn)總結(jié)容器是一種不包括重復(fù)元素的。由于接口的特殊性,所有傳入集合中的元素必須不同。集合判斷兩個(gè)對(duì)象是否相同,是使用方法,而不是使用運(yùn)算符的。只能存儲(chǔ),所以只會(huì)在存儲(chǔ)的情況下使用。 Java知識(shí)點(diǎn)總結(jié)(Java容器-Set) @(Java知識(shí)點(diǎn)總結(jié))[Java, Java容器, JavaCollection, JavaSet] Set Set是一種不包括重復(fù)元素的Col...

    dack 評(píng)論0 收藏0
  • Java識(shí)點(diǎn)總結(jié)Java容器-Collection)

    摘要:知識(shí)點(diǎn)總結(jié)容器知識(shí)點(diǎn)總結(jié)容器函數(shù)庫(kù)是包下的一些接口和類(lèi),類(lèi)是用來(lái)產(chǎn)生對(duì)象存放數(shù)據(jù)用的,而接口是訪問(wèn)數(shù)據(jù)的方式。底層也是數(shù)組實(shí)現(xiàn),線程安全,效率低效率高,線程不安全。 Java知識(shí)點(diǎn)總結(jié)(Java容器-Collection) @(Java知識(shí)點(diǎn)總結(jié))[Java, Java容器, JavaCollection] [toc] Collection Collection函數(shù)庫(kù)是java.uti...

    GeekGhc 評(píng)論0 收藏0
  • Java集合總結(jié)

    摘要:概述集合類(lèi)主要有大分支,及。不能保證元素的排列順序,順序有可能發(fā)生變化不是同步的集合元素可以是但只能放入一個(gè)是接口的唯一實(shí)現(xiàn)類(lèi),可以確保集合元素處于排序狀態(tài)。如果這兩個(gè)的通過(guò)比較返回,新添加的將覆蓋集合中原有的,但不會(huì)覆蓋。 概述 Java集合類(lèi)主要有2大分支,Collection及Map。Collection體系如下: https://upload-images.jianshu......

    toddmark 評(píng)論0 收藏0
  • 關(guān)于java集合框架的總結(jié)

    摘要:是哈希表實(shí)現(xiàn)的,中的數(shù)據(jù)是無(wú)序的,可以放入,但只能放入一個(gè),兩者中的值都不能重復(fù),就如數(shù)據(jù)庫(kù)中唯一約束。四和的相同點(diǎn)和區(qū)別相同兩者都是基于哈希表實(shí)現(xiàn)的內(nèi)部也都是通過(guò)單鏈表解決沖突問(wèn)題同樣實(shí)現(xiàn)了序列化和克隆接口區(qū)別繼承的父類(lèi)不同。 一.Arraylist與LinkedList有什么區(qū)別? 1、ArrayList是實(shí)現(xiàn)了基于動(dòng)態(tài)數(shù)組的數(shù)據(jù)結(jié)構(gòu),因?yàn)榈刂愤B續(xù),一旦數(shù)據(jù)存儲(chǔ)好了,查詢操作效率...

    Coding01 評(píng)論0 收藏0
  • Java集合問(wèn)題大匯總

    摘要:集合中成員很豐富,常用的集合有,,等。實(shí)現(xiàn)接口的集合主要有。集合中不能包含重復(fù)的元素,每個(gè)元素必須是唯一的。而以作為實(shí)現(xiàn)的構(gòu)造函數(shù)的訪問(wèn)權(quán)限是默認(rèn)訪問(wèn)權(quán)限,即包內(nèi)訪問(wèn)權(quán)限。與接口不同,它是由一系列鍵值對(duì)組成的集合,提供了到的映射。 原文地址 Java集合 Java集合框架:是一種工具類(lèi),就像是一個(gè)容器可以存儲(chǔ)任意數(shù)量的具有共同屬性的對(duì)象。 Java集合中成員很豐富,常用的集合有Arra...

    894974231 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<