hashset

package module
v1.0.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 10, 2025 License: MIT Imports: 1 Imported by: 0

README

これは何?

Go言語用の汎用的なHashSet実装です。

Goでは標準ライブラリとしてHashSetは提供されていませんが、map[T]struct{}で同じことが出来るので基本的にそれで代用することが多いです。が、毎回同じ処理を書いているのでついでに簡易ライブラリにしたという経緯です。

インストール

go get github.com/devlights/hashset@latest

クイックスタート

package main

import (
    "fmt"
    "github.com/devlights/hashset"
)

func main() {
    // 新しい文字列集合を作成
    fruits := hashset.New[string]()
    
    // 要素を追加
    fruits.Add("apple")
    fruits.Add("banana")
    fruits.Add("orange")
    
    // 要素の存在を確認
    fmt.Println(fruits.Contains("apple")) // true
    fmt.Println(fruits.Contains("grape")) // false
    
    // サイズを取得
    fmt.Printf("集合のサイズ: %d\n", fruits.Size()) // 集合のサイズ: 3
    
    // スライスに変換
    fruitsSlice := fruits.ToSlice()
    fmt.Printf("フルーツ: %v\n", fruitsSlice)
}

API リファレンス

作成
// 空の集合を作成
set := hashset.New[string]()

// 初期容量を指定して作成(パフォーマンス最適化のため)
set := hashset.NewWithCapacity[string](100)

// スライスから作成
items := []string{"apple", "banana", "orange"}
set := hashset.NewFromSlice(items)
基本操作
// 単一要素を追加
set.Add("apple")

// 複数要素を追加
set.AddAll([]string{"banana", "orange"})

// 単一要素を削除
set.Remove("apple")

// 複数要素を削除
set.RemoveAll([]string{"banana", "orange"})

// 存在確認
exists := set.Contains("apple")

// 複数要素の確認
allExist := set.ContainsAll([]string{"apple", "banana"})
anyExist := set.ContainsAny([]string{"apple", "grape"})

// サイズ取得と空かどうかの確認
size := set.Size()
empty := set.IsEmpty()

// すべての要素をクリア
set.Clear()
変換と複製
// スライスに変換
slice := set.ToSlice()

// コピーを作成
clone := set.Clone()
集合演算
set1 := hashset.NewFromSlice([]string{"apple", "banana"})
set2 := hashset.NewFromSlice([]string{"banana", "orange"})

// 和集合 (A ∪ B)
union := set1.Union(set2) // {"apple", "banana", "orange"}

// 積集合 (A ∩ B)
intersection := set1.Intersection(set2) // {"banana"}

// 差集合 (A - B)
difference := set1.Difference(set2) // {"apple"}

// 対称差集合 ((A ∪ B) - (A ∩ B))
symDiff := set1.SymmetricDifference(set2) // {"apple", "orange"}
集合関係
set1 := hashset.NewFromSlice([]string{"apple", "banana"})
set2 := hashset.NewFromSlice([]string{"apple", "banana", "orange"})

// set1がset2の部分集合かどうかを確認
isSubset := set1.IsSubsetOf(set2) // true

// set2がset1の上位集合かどうかを確認
isSuperset := set2.IsSupersetOf(set1) // true

// 集合が共通要素を持たないかどうかを確認
disjoint := set1.IsDisjoint(hashset.NewFromSlice([]string{"grape", "kiwi"})) // true

// 集合が等しいかどうかを確認
equal := set1.Equal(set1.Clone()) // true
反復処理
// 要素を反復処理
for item := range set.All() {
    fmt.Println(item)
}

使用例

異なる型での使用
// 文字列集合
fruits := hashset.NewFromSlice([]string{"apple", "banana", "orange"})

// 整数集合
numbers := hashset.NewFromSlice([]int{1, 2, 3, 4, 5})

// カスタム構造体(比較可能である必要があります)
type Person struct {
    Name string
    Age  int
}

people := hashset.New[Person]()
people.Add(Person{Name: "Alice", Age: 30})
people.Add(Person{Name: "Bob", Age: 25})
共通要素の検索
users1 := hashset.NewFromSlice([]string{"alice", "bob", "charlie"})
users2 := hashset.NewFromSlice([]string{"bob", "david", "eve"})
users3 := hashset.NewFromSlice([]string{"bob", "frank", "grace"})

// 3つすべての集合に共通するユーザーを検索
common := users1.Intersection(users2).Intersection(users3)
fmt.Println("共通ユーザー:", common.ToSlice()) // [bob]
スライスから重複を除去
func removeDuplicates[T comparable](slice []T) []T {
    set := hashset.NewFromSlice(slice)
    return set.ToSlice()
}

// 使用例
numbers := []int{1, 2, 2, 3, 3, 3, 4, 5}
unique := removeDuplicates(numbers)
// unique には [1, 2, 3, 4, 5] が含まれます(順序は保証されません)
集合ベースのデータ処理
// ユーザー権限の処理
adminUsers := hashset.NewFromSlice([]string{"alice", "bob"})
activeUsers := hashset.NewFromSlice([]string{"alice", "charlie", "david"})
bannedUsers := hashset.NewFromSlice([]string{"eve", "frank"})

// アクティブな管理者ユーザーを検索
activeAdmins := adminUsers.Intersection(activeUsers)

// システムにアクセス可能なユーザーを検索(アクティブでかつ禁止されていない)
allowedUsers := activeUsers.Difference(bannedUsers)

// いずれかのカテゴリに言及されているすべてのユーザーを検索
allUsers := adminUsers.Union(activeUsers).Union(bannedUsers)

スレッドセーフティ

この実装はスレッドセーフではありません。並行アクセスが必要な場合は、適切な同期処理でラップしてください:

import "sync"

type SafeSet[T comparable] struct {
    set hashset.Set[T]
    mu  sync.RWMutex
}

func NewSafeSet[T comparable]() *SafeSet[T] {
    return &SafeSet[T]{
        set: hashset.New[T](),
    }
}

func (s *SafeSet[T]) Add(item T) {
    s.mu.Lock()
    defer s.mu.Unlock()
    s.set.Add(item)
}

func (s *SafeSet[T]) Contains(item T) bool {
    s.mu.RLock()
    defer s.mu.RUnlock()
    return s.set.Contains(item)
}

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type Set

type Set[T comparable] map[T]struct{}

Set は Go の map 型を使用したハッシュ集合データ構造を表します。 ゼロ値は使用可能ではありません。新しい Set を作成するには New() を使用してください。

func New

func New[T comparable]() Set[T]

New は新しい空の Set を作成して返します。

func NewFromSlice

func NewFromSlice[T comparable](items []T) Set[T]

NewFromSlice は指定されたスライスから一意の要素をすべて含む新しい Set を作成して返します。

func NewWithCapacity

func NewWithCapacity[T comparable](capacity int) Set[T]

NewWithCapacity は指定された初期容量で新しい空の Set を作成して返します。 概算サイズが分かっている場合、メモリ割り当てを削減するのに役立ちます。

func (Set[T]) Add

func (s Set[T]) Add(item T)

Add は集合に要素を挿入します。

func (Set[T]) AddAll

func (s Set[T]) AddAll(items []T)

AddAll は指定されたスライスのすべての要素を集合に挿入します。

func (Set[T]) All

func (s Set[T]) All() iter.Seq[T]

All は集合のすべての要素を反復処理するための iter.Seq[T] を返します。 これにより、for range ループで Set を直接反復処理できます。 例: for item := range mySet.All() { ... }

func (Set[T]) Clear

func (s Set[T]) Clear()

Clear は集合からすべての要素を削除し、空にします。

func (Set[T]) Clone

func (s Set[T]) Clone() Set[T]

Clone は集合の浅いコピーを作成して返します。

func (Set[T]) Contains

func (s Set[T]) Contains(item T) bool

Contains は要素が集合に存在するかどうかを報告します。

func (Set[T]) ContainsAll

func (s Set[T]) ContainsAll(items []T) bool

ContainsAll は指定されたスライスのすべての要素が集合に存在するかどうかを報告します。 すべての要素が存在する場合は true、そうでなければ false を返します。

func (Set[T]) ContainsAny

func (s Set[T]) ContainsAny(items []T) bool

ContainsAny は指定されたスライスのいずれかの要素が集合に存在するかどうかを報告します。 少なくとも一つの要素が存在する場合は true、そうでなければ false を返します。

func (Set[T]) Difference

func (s Set[T]) Difference(other Set[T]) Set[T]

Difference は差集合を返します。 元の集合は変更されません。

func (Set[T]) Equal

func (s Set[T]) Equal(other Set[T]) bool

Equal はこの集合と他の集合が完全に同じ要素を含んでいるかどうかを報告します。 両方の集合が同じサイズで同じ要素を含む場合は true を返します。

func (Set[T]) Intersection

func (s Set[T]) Intersection(other Set[T]) Set[T]

Intersection は積集合を返します。 元の集合は変更されません。

func (Set[T]) IsDisjoint

func (s Set[T]) IsDisjoint(other Set[T]) bool

IsDisjoint はこの集合と他の集合が共通要素を持たないかどうかを報告します。

func (Set[T]) IsEmpty

func (s Set[T]) IsEmpty() bool

IsEmpty は集合が要素を含んでいないかどうかを報告します。

func (Set[T]) IsSubsetOf

func (s Set[T]) IsSubsetOf(other Set[T]) bool

IsSubsetOf はこの集合が他の集合の部分集合かどうかを報告します。 この集合のすべての要素が他の集合にも存在する場合は true を返します。

func (Set[T]) IsSupersetOf

func (s Set[T]) IsSupersetOf(other Set[T]) bool

IsSupersetOf はこの集合が他の集合の上位集合かどうかを報告します。 他の集合のすべての要素がこの集合にも存在する場合は true を返します。

func (Set[T]) Remove

func (s Set[T]) Remove(item T)

Remove は集合から要素を削除します。

func (Set[T]) RemoveAll

func (s Set[T]) RemoveAll(items []T)

RemoveAll は指定されたスライスのすべての要素を集合から削除します。

func (Set[T]) Size

func (s Set[T]) Size() int

Size は集合内の要素数を返します。

func (Set[T]) SymmetricDifference

func (s Set[T]) SymmetricDifference(other Set[T]) Set[T]

SymmetricDifference は対称差集合を返します。 元の集合は変更されません。

func (Set[T]) ToSlice

func (s Set[T]) ToSlice() []T

ToSlice は集合内のすべての要素を含むスライスを返します。 要素の順序は保証されません。

func (Set[T]) Union

func (s Set[T]) Union(other Set[T]) Set[T]

Union は和集合を返します。 元の集合は変更されません。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL