日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無先后,達(dá)者為師

網(wǎng)站首頁 編程語言 正文

GO語言對數(shù)組切片去重的實(shí)現(xiàn)_Golang

作者:抬頭看天空 ? 更新時(shí)間: 2022-06-19 編程語言

Go語言是2007年由Google開發(fā)的一種靜態(tài)強(qiáng)類型的編譯型語言,其語法結(jié)構(gòu)上與C非常接近。在垃圾回收、錯(cuò)誤處理以及包庫方面比C要方便的多,因此從開發(fā)速度上來講比C要快的多,而運(yùn)行速度也接近于C語言。以下實(shí)現(xiàn)GO語言對數(shù)組切片去重

1.go中沒有去重方法

自己實(shí)現(xiàn)

package main

import (
? ? "fmt"
)

func main() {
? ? s := []string{"hello", "world", "hello", "golang", "hello", "ruby", "php", "java"}

? ? fmt.Println(removeDuplicateElement(s)) //output: hello world golang ruby php java
}

func removeDuplicateElement(languages []string) []string {
? ? result := make([]string, 0, len(languages))
? ? temp := map[string]struct{}{}
? ? for _, item := range languages {
? ? ? ? if _, ok := temp[item]; !ok {
? ? ? ? ? ? temp[item] = struct{}{}
? ? ? ? ? ? result = append(result, item)
? ? ? ? }
? ? }
? ? return result
}

2.自定義一個(gè)適配多個(gè)切片類型的去重器

下面對嗎主要看

1.自定義sliceError結(jié)構(gòu)體并實(shí)現(xiàn)Error方法
2.最后default中返回sliceError中自動會調(diào)用Errors使轉(zhuǎn)換成error。

package common

import (
? ? "fmt"
)

type sliceError struct {
? ? msg string
}

func (e *sliceError) Error() string {
? ? return e.msg
}

func Errorf(format string, args ...interface{}) error {
? ? msg := fmt.Sprintf(format, args...)
? ? return &sliceError{msg}
}

func removeDuplicateElement1(originals interface{}) (interface{}, error) {
? ? temp := map[string]struct{}{}
? ? switch slice := originals.(type) {
? ? case []string:
? ? ? ? result := make([]string, 0, len(originals.([]string)))
? ? ? ? for _, item := range slice {
? ? ? ? ? ? key := fmt.Sprint(item)
? ? ? ? ? ? if _, ok := temp[key]; !ok {
? ? ? ? ? ? ? ? temp[key] = struct{}{}
? ? ? ? ? ? ? ? result = append(result, item)
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? return result, nil
? ? case []int64:
? ? ? ? result := make([]int64, 0, len(originals.([]int64)))
? ? ? ? for _, item := range slice {
? ? ? ? ? ? key := fmt.Sprint(item)
? ? ? ? ? ? if _, ok := temp[key]; !ok {
? ? ? ? ? ? ? ? temp[key] = struct{}{}
? ? ? ? ? ? ? ? result = append(result, item)
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? return result, nil
? ? default:
? ? ? ? err := Errorf("Unknown type: %T", slice)
? ? ? ? return nil, err
? ? }
}

補(bǔ)充:

通過map鍵的唯一性去重(推薦)

//通過map鍵的唯一性去重
func RemoveRepeatedElement(s []int) []int {
?? ?result := make([]int, 0)
?? ?m := make(map[int]bool) //map的值不重要
?? ?for _, v := range s {
?? ??? ?if _, ok := m[v]; !ok {
?? ??? ??? ?result = append(result, v)
?? ??? ??? ?m[v] = true
?? ??? ?}
?? ?}
?? ?return result
}

通過map鍵的唯一性去重

定義一個(gè)新切片(數(shù)組),存放原數(shù)組的第一個(gè)元素,然后將新切片(數(shù)組)與原切片
(數(shù)組)的元素一一對比,如果不同則存放在新切片(數(shù)組)中。

func RemoveRepeatedElement(arr []int) (newArr []int) {
?? ?newArr = make([]int, 0)
?? ?for i := 0; i < len(arr); i++ {
?? ??? ?repeat := false
?? ??? ?for j := i + 1; j < len(arr); j++ {
?? ??? ??? ?if arr[i] == arr[j] {
?? ??? ??? ??? ?repeat = true
?? ??? ??? ??? ?break
?? ??? ??? ?}
?? ??? ?}
?? ??? ?if !repeat {
?? ??? ??? ?newArr = append(newArr, arr[i])
?? ??? ?}
?? ?}
?? ?return
}

原文鏈接:https://blog.csdn.net/w5025/article/details/122527409

欄目分類
最近更新