Golang中如何高效去除重复数据

Golang中如何高效去除重复数据 如何根据任意元素(例如 userid)移除重复的 interface {}?

    "phonebook": [
        {
            "contact_id": 1,
            "user_id": 13,
            "userid": 2,
            "username": "Tester"
        },
        {
            "contact_id": 1,
            "user_id": 13,
            "userid": 2,
            "username": "Tester"
        },
        {
            "contact_id": 3,
            "user_id": 13,
            "userid": 22,
            "username": "Tester"
        }
    ]

更多关于Golang中如何高效去除重复数据的实战教程也可以访问 https://www.itying.com/category-94-b0.html

5 回复

感谢朋友帮助我这个Go语言新手,我必须赞赏社区的响应速度。

更多关于Golang中如何高效去除重复数据的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


我连一个 interface{} 都没看到,你能详细说明一下你想要什么吗?

抱歉。我想根据属性(即“userid”)从哈希数组中移除重复项。例如:

输入

    "phonebook": [
        {
            "contact_id": 1,
            "user_id": 13,
            "userid": 2,
            "username": "Tester"
        },
        {
            "contact_id": 1,
            "user_id": 13,
            "userid": 2,
            "username": "Tester"
        },
        {
            "contact_id": 3,
            "user_id": 13,
            "userid": 22,
            "username": "Tester"
        }
    ]

所需输出是:

"phonebook": [
    {
        "contact_id": 1,
        "user_id": 13,
        "userid": 2,
        "username": "Tester"
    },
    {
        "contact_id": 3,
        "user_id": 13,
        "userid": 22,
        "username": "Tester"
    }
]

可以使用 map 来记录已出现过的键值,通过遍历切片并检查键是否已存在于 map 中,从而过滤掉重复项。这里以 userid 为例:

package main

import (
	"encoding/json"
	"fmt"
)

func deduplicateByKey(data []interface{}, key string) []interface{} {
	seen := make(map[interface{}]bool)
	result := []interface{}{}

	for _, item := range data {
		itemMap, ok := item.(map[string]interface{})
		if !ok {
			continue
		}
		keyValue := itemMap[key]
		if !seen[keyValue] {
			seen[keyValue] = true
			result = append(result, item)
		}
	}
	return result
}

func main() {
	jsonStr := `{
		"phonebook": [
			{"contact_id": 1, "user_id": 13, "userid": 2, "username": "Tester"},
			{"contact_id": 1, "user_id": 13, "userid": 2, "username": "Tester"},
			{"contact_id": 3, "user_id": 13, "userid": 22, "username": "Tester"}
		]
	}`

	var data map[string]interface{}
	json.Unmarshal([]byte(jsonStr), &data)

	phonebook := data["phonebook"].([]interface{})
	deduplicated := deduplicateByKey(phonebook, "userid")

	data["phonebook"] = deduplicated
	output, _ := json.MarshalIndent(data, "", "  ")
	fmt.Println(string(output))
}

输出结果:

{
  "phonebook": [
    {
      "contact_id": 1,
      "user_id": 13,
      "userid": 2,
      "username": "Tester"
    },
    {
      "contact_id": 3,
      "user_id": 13,
      "userid": 22,
      "username": "Tester"
    }
  ]
}

如果数据结构已知,使用具体类型会更高效:

type Contact struct {
	ContactID int    `json:"contact_id"`
	UserID    int    `json:"user_id"`
	Userid    int    `json:"userid"`
	Username  string `json:"username"`
}

func deduplicateContacts(contacts []Contact) []Contact {
	seen := make(map[int]bool)
	result := []Contact{}

	for _, contact := range contacts {
		if !seen[contact.Userid] {
			seen[contact.Userid] = true
			result = append(result, contact)
		}
	}
	return result
}

这种方法的时间复杂度是 O(n),空间复杂度是 O(n),其中 n 是切片长度。map 的查找操作是 O(1),因此效率较高。

回到顶部