LoginSignup
1
0

[golang] 構造体のスライスを重複排除(with ソート)

Posted at

参考: https://future-architect.github.io/articles/20230816a/
この方法だと、重複排除するには事前にソートしないとダメらしい

例)
SQLでいう

select distinct * 
order by classNumber, name, age

をgoの構造体のスライスで、やる。

package main

import (
	"cmp"
	"fmt"
	"slices"
)

type user struct {
	classNumber uint8
	name        string
	age         uint8
}

func main() {
	users := []user{
		{classNumber: 2, name: "hanako", age: 12},
		{classNumber: 3, name: "jiro", age: 32},
		{classNumber: 2, name: "hanako", age: 12},
		{classNumber: 1, name: "taro", age: 22},
		{classNumber: 2, name: "yuki", age: 13},
	}
	slices.SortFunc(users, func(a, b user) int {
		c := cmp.Compare(a.classNumber, b.classNumber)
		if c == 0 {
			c = cmp.Compare(a.name, b.name)
			if c == 0 {
				c = cmp.Compare(a.age, b.age)
			}
		}
		return c
	})
	fmt.Println(users)

	sortedUniqueUsers := slices.CompactFunc(users, func(a, b user) bool {
		return reflect.DeepEqual(a, b)
	})

	fmt.Println(sortedUniqueUsers)
}

結果出力

[{1 taro 22} {2 hanako 12} {2 hanako 12} {2 yuki 13} {3 jiro 32}] # いったんソート
[{1 taro 22} {2 hanako 12} {2 yuki 13} {3 jiro 32}] # 重複排除

Program exited.
1
0
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
0