4 回答

TA貢獻1998條經驗 獲得超6個贊
問題中的代碼已經差不多了。當在 中找到匹配元素時unique,用當前值覆蓋該元素:
func unique(sample []samplestruct) []samplestruct {
var unique []samplestruct
sampleLoop:
for _, v := range sample {
for i, u := range unique {
if v.value1 == u.value1 && v.value2 == u.value2 && v.value3 == u.value3 {
unique[i] = v
continue sampleLoop
}
}
unique = append(unique, v)
}
return unique
}
其他答案中顯示的基于地圖的方法可能更合適,具體取決于數據集的大小和幸存元素的數量。這是地圖方法的正確實現:
func unique(sample []samplestruct) []samplestruct {
var unique []samplestruct
type key struct{ value1, value2, value3 string }
m := make(map[key]int)
for _, v := range sample {
k := key{v.value1, v.value2, v.value3}
if i, ok := m[k]; ok {
// Overwrite previous value per requirement in
// question to keep last matching value.
unique[i] = v
} else {
// Unique key found. Record position and collect
// in result.
m[k] = len(unique)
unique = append(unique, v)
}
}
return unique
}

TA貢獻1982條經驗 獲得超2個贊
很好的小練習,這是一個解決方案,我將在下面解釋:
package main
import "fmt"
func main() {
all := []person{
{"ram", "rahim", "india", "34", "india"},
{"ram", "rahim", "india", "38", "America"},
{"ram", "rahim", "india", "40", "Jamica"},
{"amit", "rawat", "bangladesh", "35", "hawai"},
{"amit", "rawat", "bangladesh", "36", "india"},
}
var deduped []person
// add the last occurrence always
for i := len(all) - 1; i >= 0; i-- {
if !contains(deduped, all[i]) {
// "append" to the front of the array
deduped = append([]person{all[i]}, deduped...)
}
}
for _, x := range deduped {
fmt.Println(x)
}
}
type person [5]string
func eq(a, b person) bool {
return a[0] == b[0] && a[1] == b[1] && a[2] == b[2]
}
func contains(list []person, x person) bool {
for i := range list {
if eq(x, list[i]) {
return true
}
}
return false
}
我們向后遍歷輸入數組,以捕獲多個相等項中的最后一個。然后我們想將該項目附加到數組的后面deduped。這就是為什么我們恢復追加操作,創建一個新的臨時單項person切片并將前一個切片附加到其中。
從效率角度來看,該解決方案有一些缺點,附加到單項切片將使用 O(n2) 空間,因為它每次都會生成一個新切片,預先分配一個 數組,附加到它,然后反轉它可以len(all)解決那個問題。
如果您對無數次執行此操作,可能會出現的第二個性能問題person是contains程序的 O(n2) 查找函數。這可以通過map[person]bool.

TA貢獻1898條經驗 獲得超8個贊
也許你應該在這里使用一個映射,使用重要的值作為鍵,當你遇到重復并檢查鍵時,你替換映射中的值。
unique
目前,如果您之前沒有遇到過這些值,則將其添加到數組中,然后如果您在數組中遇到該值,則跳過它。這就是為什么您只添加每個結構的第一次遇到,這與您想要的相反。
您可以將映射的鍵生成為重要值(1 到 3)的串聯,或者使用三個值的結構作為鍵,并為每個項目構建新的鍵結構,然后在地圖。
使用映射也比數組具有更高的性能,因為在映射中查找比unique
每次迭代數組要快得多。

TA貢獻1895條經驗 獲得超3個贊
使用地圖。首先掃描列表并設置一個映射,其中前 3 個值作為映射的鍵。每個鍵的映射值將是最后找到的
然后在地圖上行走,它將被設置為正確的值
package main
import (
"fmt"
"strings"
)
type samplestruct struct {
value1 string
value2 string
value3 string
value4 string
value5 string
}
func mkey(x samplestruct) string {
return strings.Join([]string{x.value1, x.value2, x.value3}, "-")
}
func main() {
cm := make(map[string]samplestruct)
exampledata := []samplestruct{samplestruct{"ram", "rahim", "india", "34", "india"},
samplestruct{"ram", "rahim", "india", "38", "America"},
samplestruct{"ram", "rahim", "india", "40", "Jamica"},
samplestruct{"amit", "rawat", "bangladesh", "35", "hawai"},
samplestruct{"amit", "rawat", "bangladesh", "36", "india"}}
for _, x := range exampledata {
k := mkey(x)
cm[k] = x
}
for x := range cm {
fmt.Println(cm[x])
}
}
https://play.golang.org/p/ITD0VjhFQEk
- 4 回答
- 0 關注
- 227 瀏覽
添加回答
舉報