Go でスライスを操作するとき、重複した要素をフィルタリングする必要がある状況が発生することがあります。この記事では、Go でこれを実現するためのさまざまなアプローチについて説明します。
一般的だが非効率的な手法は、スライスを反復処理し、ネストされたループを使用して重複をチェックすることです。この方法は機能しますが、時間計算量は O(n^2) であり、大きなスライスの場合は遅くなる可能性があります。
より効率的なアプローチでは、Go が構築したものを利用します。 -in マップ タイプ。ここでは 2 つの解決策を示します:
ジェネリック ソリューション:
ジェネリック (Go 1.18 で導入) を使用すると、任意のデータ型の重複を削除するジェネリック関数を作成できます。同等のタイプ。
func removeDuplicate[T comparable](sliceList []T) []T { allKeys := make(map[T]bool) list := []T{} for _, item := range sliceList { if _, value := allKeys[item]; !value { allKeys[item] = true list = append(list, item) } } return list }
向けに最適化されたソリューション文字列:
文字列のスライスの場合、マップ キーの検索を最適化する専用関数を作成できます:
func removeDuplicateStr(strSlice []string) []string { allKeys := make(map[string]bool) list := []string{} for _, item := range strSlice { if _, value := allKeys[item]; !value { allKeys[item] = true list = append(list, item) } } return list }
一般的なソリューションは次のことを証明します。柔軟性は高くなりますが、文字列固有のソリューションよりも若干遅くなります。大規模なスライスでベンチマークを行うと、文字列固有のソリューションの方が大幅に高速であることがわかります。
Go でスライスから重複を削除する場合、最も効率的なアプローチの選択は、特定のユースケースとデータ型によって異なります。 。複雑なデータ型または小さなスライスの場合は、一般的なソリューションが適しています。文字列の大きなスライスの場合、文字列固有のソリューションは最適なパフォーマンスを提供します。
以上がGo でスライスから重複要素を効率的に削除するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。