iT邦幫忙

0

Golang map判斷重複 並刪除

我去得一串map如下
[map[userId:1] map[userId:2] map[userId:3] map[userId:3]]
這是我print出來的字串

請問我要怎麼判斷重複的並留下一個
剛接觸不久..還在邊做邊學...

2 個回答

0
listennn08
iT邦高手 7 級 ‧ 2020-05-25 13:17:56
最佳解答

這樣?

package main

import (
	"fmt"
	"reflect"
)

func unique(arr []map[string]int) []map[string]int {
	for index, _:= range arr {
		for i := index +1; i < len(arr) ; i++ {
			if (reflect.DeepEqual(arr[i], arr[index]) ) {
				arr = append(arr[:i], arr[i+1:]...);
                i-=1 // 因為刪除資料 arr 長度會縮減, 如果有兩個以上重複會比對不到
			}
		}
	}
	return arr;
}

func main() {
	var map1, map2, map3 map[string]int;
	map1, map2, map3 = make(map[string]int), make(map[string]int), make(map[string]int);
	map1["userId"] = 1;
	map2["userId"] = 2;
	map3["userId"] = 3;
	
	array := []map[string]int{map1, map2, map3, map3};
	fmt.Println(unique(array)); //[map[userId:1] map[userId:2] map[userId:3]]
}

demo on Go Playground

謝謝~~/images/emoticon/emoticon02.gif

0
z9905080
iT邦見習生 ‧ 2020-05-26 21:44:54

是需要對整個內部object做完整資料比較,還是只是想比較userId欄位的值?
這兩個問題的方向性比較不同

func unique(arr []map[string]int) []map[string]int {
	for index, _:= range arr {
		for i := index +1; i < len(arr) ; i++ {
			if reflect.DeepEqual(arr[i], arr[index]) {
				arr = append(arr[:i], arr[i+1:]...)
			}
		}
	}
	return arr;
}


func main() {
	map1, map2, map3,map4 := make(map[string]int), make(map[string]int), make(map[string]int), make(map[string]int)
	map1["userId"] = 1
	map2["userId"] = 2
	map3["userId"] = 3
	map4["userId"] = 3
	map4["key"] = 3

	array := []map[string]int{map1, map2, map3, map4}
	fmt.Println(unique(array)) //[map[userId:1] map[userId:2] map[userId:3]]
}

引用樓上的例子做個修改,大概表達下我想說明的
outPut: [map[userId:1] map[userId:2] map[userId:3] map[key:3 userId:3]]

這麼說是的確,研究了一下也發現原本 code 裡的 bug,
如果只要比對 userId 這個欄位的話

func unique(arr []map[string]int) []map[string]int {
	for index, _:= range arr {
		for i := index+1; i< len(arr); i++ {
			if (arr[index]["userId"] == arr[i]["userId"]) {
				arr = append(arr[:i], arr[i+1:]...);
				i-=1
			}
		}
	}
	return arr;
}

demo

我要發表回答

立即登入回答