golangアレイ、差集合、およびセット、補体との交点

今日、同社との間で設定差はないダウン図書館で、二つの配列を必要とし、それは独立しており、私は読者に役立つ願っています

パッケージモデルの


インポート(
    " ソート" 
    " 同期" 

の設定を入力のstruct { 
    sync.RWMutex型の
    m個のマップを[ INT ] BOOL 
} 

// 新建集合对象 
FUNC新(項目... int型)* 集合{ 
    S: =&集合{ 
        M:作る(マップ[ INT ] BOOL 、LEN(アイテム))、
    } 
    s.Add(項目...)
    戻りS 
} 

// 添加元素 
FUNC(S *セット)を追加(アイテムは... int型){  
    s.Lock( )
    s.Unlockを延期します()
    するため =:_、V レンジ項目{ 
        SM [V] = 
    } 
} 

// 删除元素 
(項目を削除... FUNC(S *セット)INT ){ 
    s.Lock()は
    Sを延期。 ()ロックを解除
    するために _、V:= レンジ項目{ 
        (SM、v)を削除
    } 
} 

// 判断元素是否存在 
FUNC(S *セット)(項目...持ってint型BOOL { 
    s.RLock()は
    Sを延期。 RUnlock()
    のための _、V:= 範囲項目{
         なら _、OK:= SM [V]。OK {
            返す falseに
        } 
    } 
    リターン をtrueに
} 

// 要素の数 
FUNC(セットS *)カウント()int型{
     返すLEN(SM)
} 

// 空集合 
FUNC(S * セット)クリア(){ 
    s.Lockを()
    延期S .Unlock()
    SM =マップ[ INT ] BOOL {} 
} 

// ヌル集合の決意の 
FUNC(S *セット)が空()BOOL {
     戻り LEN(SM)== 0 
} 

// 順序なしリスト 
FUNC(S *セット)リスト()[] INT {
    s.RLock() 
    延期s.RUnlock()
    リスト: =を作る([] INT0 、LEN(SM))
     のための項目:= 範囲SM { 
        リスト = 追加(リスト項目)
    } 
    戻りリスト
} 

// 排序列表 
FUNC(S *セット)sortlistが()[] INT { 
    s.RLock()
    s.RUnlock()延期
    リスト: =([]作るINT0 、LEN(SM))を
     するための項目:= 範囲SM { 
        リスト = 追加(リスト項目)
    } 
    sort.Ints(リスト)
    リターンリスト
} 

// 并集の 
FUNC(S *セット)連合(セット... *セット)* 集合{ 
    R: = 新(s.List()...)
     のために _、設定:= レンジセットを{
         のための E: =範囲設定.M { 
            RM [E] = 
        } 
    } 
    戻りR 
} 

// 差集 
FUNC(S *セット)マイナス(セット... *セット)* 集合{ 
    R: = 新しい(s.List()。 ..)
      _、セット:= レンジセット{
         ための E:=レンジセット.M {
             もし _、OK:= SM [E]。[OK] { 
                削除(RM、E)
            } 
        } 
    } 
    戻りR 
} 

// 交集 
FUNC(S *セット)交差(セット... *セット)* 集合{ 
    R: = 新(s.List()...)
     について _、設定:= レンジセット{
         ための E:= レンジSM {
             なら OK、_:= 設定 .M [E]。OK { 
                削除(RM、E)
            } 
        } 
    } 
    戻りR 
}

//补集 
FUNC(S *セット)補体(フル・セット)* 集合{ 
    :R = 新しい()
     のための E:= レンジfull.m {
         なら _、OK:= SM [E]。OK { 
            r.Add(E)
        } 
    } 
    戻りR 
}

ありがとう、ありがとう!

おすすめ

転載: www.cnblogs.com/tsxylhs/p/11267326.html