はじめに
配列やスライスから重複する要素を排除したい場面って、意外としばしば出くわしますよね。今回は、そんな時に役立つCustomMap
型を使った解決方法をご紹介します。
CustomMap
型の定義
まずはじめに、重複をスマートに管理し、すっきりと排除するためのCustomMap
型を定義してみましょう。この型は、map[string]bool
をうまくラップして、文字列のキーにtrue
を割り当てます。キーが自動的に一意になるので、これを使えば重複排除の土台がしっかりと築かれます。
type CustomMap map[string]bool
NewCustomMap
関数の実装
重複排除の鍵となるのは、NewCustomMap
関数です。この関数が、与えられた文字列リストから新しいCustomMap
インスタンスを作り上げるんです。文字列をマップのキーとして使うことで、キーの一意性が保証されます。Goのマップでは、各キーは一意でなければならず、同じキーに対して値を再度設定しようとしても、最初の値が上書きされるだけで、新しいエントリーは追加されません。 この性質を利用することで、与えられた文字列リストの中で重複している要素があっても、CustomMap
にはそれぞれの要素が一度だけ格納され、結果として重複がないスッキリした状態が作り出されます。つまり、NewCustomMap
関数内でリストの各要素を順に処理し、マップに追加する際、重複する要素が自動的に排除されるわけです。
func NewCustomMap(items []string) CustomMap {
m := make(CustomMap)
for _, item := range items {
m[item] = true
}
return m
}
GetKeys
メソッドの定義
そして、CustomMap
に保管された一意なキーを取得するためのメソッドです。
func (m CustomMap) GetKeys() []string {
keys := make([]string, 0, len(m))
for key := range m {
keys = append(keys, key)
}
return keys
}
実際のコードと処理結果の表示
さて、実際に重複を含む文字列スライスを用意して、CustomMap
を通じてどう変わるか見てみましょう。
package main
import (
"fmt"
)
type CustomMap map[string]bool
func NewCustomMap(items []string) CustomMap {
m := make(CustomMap)
for _, item := range items {
m[item] = true
}
return m
}
func (m CustomMap) GetKeys() []string {
keys := make([]string, 0, len(m))
for key := range m {
keys = append(keys, key)
}
return keys
}
func main() {
// 重複を含む文字列スライス
items := []string{"apple", "banana", "apple", "orange", "banana", "grape"}
// CustomMapを利用して重複を排除し、一意なアイテムのスライスを取得
uniqueItems := NewCustomMap(items).GetKeys()
// 結果の表示
fmt.Println("元のスライス:", items)
fmt.Println("重複排除後のスライス:", uniqueItems)
}
// 元のスライス: [apple banana apple orange banana grape]
// 重複排除後のスライス: [apple banana orange grape]
まとめ
CustomMap
型を利用することで、map[string]bool
のキーの一意性を上手く活用し、重複を効率的に取り除くことができます。このシンプルだけど強力な手法で、Goにおけるデータ処理をもっとスマートに進めましょう。
参考資料