1
1
Qiita×Findy記事投稿キャンペーン 「自分のエンジニアとしてのキャリアを振り返ろう!」

Go言語での重複排除処理とカスタムマップ型の利用

Last updated at Posted at 2024-02-08

はじめに

配列やスライスから重複する要素を排除したい場面って、意外としばしば出くわしますよね。今回は、そんな時に役立つ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におけるデータ処理をもっとスマートに進めましょう。

参考資料

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1