數(shù)據(jù)結(jié)構(gòu)與算法JavaScript描述(7) —— 集合(Set)

集合

一組無(wú)序但彼此之間又有一定相關(guān)性的成員構(gòu)成紧帕,每個(gè)成員在集合中只能出現(xiàn)一次沪悲。

集合相關(guān)的一些基本概念

  1. 集合的定義:
(1)不包含任何成員的集合稱為空集,全集則是包含一切可能成員的集合
(2)如果兩個(gè)集合的成員完全相同口渔,則兩個(gè)集合相等
(3)如果一個(gè)集合中所有的成員都屬于另外一個(gè)集合落午,則前一集合稱為后一集合的子集蛹找。
  1. 集合的操作:
(1)并集(合并)
(2)交集(共同存在的)
(3)補(bǔ)集(屬于一個(gè)集合不屬于另一個(gè)集合的成員組成的集合)

實(shí)現(xiàn):

class Set {

    constructor() {
        this.elements = []
    }

    get size() {
        return this.elements.length
    }

    get isEmpty() {
        return !this.elements.length
    }

    // 添加元素,確保元素是唯一的
    add(...eles) {
        for (let ele of eles) {
            if (this.contains(ele)) {
                console.warn(`集合中已存在該元素: ${ele}`)
                continue
            } else {
                this.elements.push(ele)
            }
        }
    }

    // 刪除元素
    remove(...eles) {
        for (let ele of eles) {
            const pos = this.elements.indexOf(ele)
            if (pos > -1) {
                this.elements.splice(pos, 1)
            } else {
                console.warn(`集合中不存在元素: ${ele}劫恒, 無(wú)法刪除`)
            }
        }
    }

    // 判斷集合中是否包含某個(gè)元素
    contains(ele) {
        return this.elements.includes(ele)
    }

    // 并集
    union(set) {
        const tempSet = new Set()
        this.elements.forEach(item => {
            tempSet.add(item)
        })
        set.elements.forEach(item => {
            if (!this.contains(item)) {
                tempSet.add(item)
            }
        })
        return tempSet
    } 

    // 交集
    intersect(set) {
        const tempSet = new Set()
        set.elements.forEach(item => {
            if (this.contains(item)) {
                tempSet.add(item)
            }
        })
        return tempSet
    }

    // 判斷子集贩幻,當(dāng)前集合是不是入?yún)⒓系囊粋€(gè)子集
    subsetOf(set) {
        if (set.size < this.size) return false
        for (let i = 0; i < this.size; i++) {
            if (!set.contains(this.elements[i])) {
                return false
            }
        }
        return true
    }

    // 補(bǔ)集,屬于當(dāng)前集合两嘴,而不屬于入?yún)⒓系脑?    difference(set) {
        const tempSet = new Set()
        this.elements.forEach(item => {
            if (!set.contains(item)) {
                tempSet.add(item)
            }
        })
        return tempSet
    }

    // 返回比傳入元素大的元素中最小的那個(gè)
    higher(ele) {
        let temp = null
        let i = this.size
        while(i >= 0) {
            if (this.elements[i] > ele && 
                (temp !== null && this.elements[i] < temp ||
                    temp === null)
                ) {
                temp = this.elements[i]
            }
            i--
        }
        return temp
    }

    // 返回比傳入元素小的元素中最大的那個(gè)
    lower(ele) {
        let temp = null
        let i = this.size
        while(i >= 0) {
            if (this.elements[i] < ele && 
                (temp !== null && this.elements[i] > temp ||
                temp === null)
                ) {
                temp = this.elements[i]
            }
            i--
        }
        return temp 
    }

    // 元素的字符串形式顯示
    toString() {
        return this.elements.toString()
    }
}

// test
const set = new Set()
set.add(49, 100, 2, 30, 18, 256, 99)
console.log(set.toString())     // 49,100,2,30,18,256,99
set.remove(49, 18)
console.log(set.toString())     // 100,2,30,256,99
console.log(set.size)                   // 5

const set1 = new Set()
set1.add(5, 8, 100, 30, 256)    
console.log(set1.toString())  // 5,8,100,30,256

// 并集
console.log(set.union(set1).toString()) // 100,2,30,256,99,5,8
// 交集
console.log(set.intersect(set1).toString())     // 100,30,256
// 子集
console.log(set.subsetOf(set1).toString())      // false
// 補(bǔ)集
console.log(set.difference(set1).toString())    // 2,99

console.log(set.toString())     // 100,2,30,256,99

console.log(set.higher(99))     // 100

console.log(set.lower(99))      // 30
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末丛楚,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子憔辫,更是在濱河造成了極大的恐慌趣些,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贰您,死亡現(xiàn)場(chǎng)離奇詭異坏平,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)锦亦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門舶替,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人孽亲,你說我怎么就攤上這事坎穿。” “怎么了返劲?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵玲昧,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我篮绿,道長(zhǎng)孵延,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任亲配,我火速辦了婚禮尘应,結(jié)果婚禮上惶凝,老公的妹妹穿的比我還像新娘。我一直安慰自己犬钢,他們只是感情好苍鲜,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著玷犹,像睡著了一般混滔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上歹颓,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天坯屿,我揣著相機(jī)與錄音,去河邊找鬼巍扛。 笑死领跛,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的撤奸。 我是一名探鬼主播吠昭,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼胧瓜!你這毒婦竟也來了怎诫?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤贷痪,失蹤者是張志新(化名)和其女友劉穎幻妓,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體劫拢,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡肉津,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了舱沧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片妹沙。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖熟吏,靈堂內(nèi)的尸體忽然破棺而出距糖,到底是詐尸還是另有隱情,我是刑警寧澤牵寺,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布悍引,位于F島的核電站,受9級(jí)特大地震影響帽氓,放射性物質(zhì)發(fā)生泄漏趣斤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一黎休、第九天 我趴在偏房一處隱蔽的房頂上張望浓领。 院中可真熱鬧玉凯,春花似錦、人聲如沸联贩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)泪幌。三九已至歹啼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間座菠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來泰國(guó)打工藤树, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留浴滴,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓岁钓,卻偏偏與公主長(zhǎng)得像升略,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子屡限,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 愉快的假期告一段落品嚣,繼續(xù)我們的學(xué)習(xí)~ 集合(Set) 同數(shù)學(xué)中所學(xué)的一樣,集合(Set)是由一組無(wú)序但彼此之間又有...
    Cryptic閱讀 6,662評(píng)論 4 8
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,498評(píng)論 25 707
  • 其實(shí)我已經(jīng)忘記了高考前是怎么樣的心態(tài)钧大,只隱約記得無(wú)比期待6.8考完那天翰撑,因?yàn)槟翘焓莿W(wǎng)三新服開服的第一天。...
    Downey_95閱讀 154評(píng)論 0 1
  • 概述 相信使用過android手機(jī)的朋友都見過下面樣子的選項(xiàng)卡啊央,本文我們嘗試做看看眶诈。 思路 這個(gè)選項(xiàng)卡頁(yè)面,或者說...
    張?jiān)骑wVir閱讀 3,482評(píng)論 0 51
  • 文|西雅圖不眠 最近網(wǎng)絡(luò)學(xué)習(xí)變得越來越流行瓜饥,為了不讓自己落隊(duì)伍逝撬,我也跟隨學(xué)習(xí)熱潮在網(wǎng)上購(gòu)買了很多課程,尤其是在 邏...
    西雅圖不眠閱讀 218評(píng)論 0 1