golang の次のチュートリアル コラムでは、go 言語を使用して 2 つの配列を見つける場合の類似点と相違点を紹介します。
#最近プロジェクトで小さな要件に遭遇しました。入力は 2 つの配列、古い配列と新しい配列です要件 古い配列を基準にして新しい配列の新しい要素と削除された要素をすべて取得する 例:
输入:
arr_old: {"1", "2", "4", "5", "7", "9"}
arr_new: {"2", "3", "4", "6", "7"}
返回:
arr_added: {"3", "6"}
arr_deleted: {"1", "5", "9"}go の標準ライブラリには同様の直接比較メソッドがありません。自分で実装する必要があります最も単純な方法は、もちろん古い配列です。要素ごとに新しい配列に移動します。見つからない場合は削除します。その後、新しい配列の要素を古い配列から 1 つずつ検索します。見つかった場合は、が見つからない場合は追加しますが、この方法はあまりにも非効率です。
ここでは、集合演算に基づいたアイデアを使用します。つまり、2 つの配列の交差と和集合をそれぞれ見つけます。和集合から交差を引いたものがすべての変更された要素 (または新しい要素) になります。削除済み)、このセット内の要素を走査し、古い配列を検索します。古い配列で見つかった場合、それは削除された要素です。それ以外の場合、見つからない場合は、新しい配列で見つける必要があります (使用実際に再度走査することなく)、それは新しく追加された要素になります。
コードの上にトリックがあります。これは、Go のマップ キーの一意性を利用し、配列の要素をマップのキーとして使用し、マップを使用して高速に実行することです。検索。
package main
import (
"fmt"
)
func main() {
//fmt.Println("Hello World!")
src := []string{"1", "2", "4", "5", "7", "9"}
dest := []string{"2", "3", "4", "6", "7"}
added, removed := Arrcmp(src, dest)
fmt.Printf("add: %v\nrem: %v\n", added, removed)
}
func Arrcmp(src []string, dest []string) ([]string, []string) {
msrc := make(map[string]byte) //按源数组建索引
mall := make(map[string]byte) //源+目所有元素建索引
var set []string //交集
//1.源数组建立map
for _, v := range src {
msrc[v] = 0
mall[v] = 0
}
//2.目数组中,存不进去,即重复元素,所有存不进去的集合就是并集
for _, v := range dest {
l := len(mall)
mall[v] = 1
if l != len(mall) { //长度变化,即可以存
l = len(mall)
} else { //存不了,进并集
set = append(set, v)
}
}
//3.遍历交集,在并集中找,找到就从并集中删,删完后就是补集(即并-交=所有变化的元素)
for _, v := range set {
delete(mall, v)
}
//4.此时,mall是补集,所有元素去源中找,找到就是删除的,找不到的必定能在目数组中找到,即新加的
var added, deleted []string
for v, _ := range mall {
_, exist := msrc[v]
if exist {
deleted = append(deleted, v)
} else {
added = append(added, v)
}
}
return added, deleted
}実行結果:
add: [6 3] rem: [1 5 9]
以上がGo 言語を使用して 2 つの配列の類似点と相違点を見つける方法の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。