다음 튜토리얼 칼럼인 golang에서는 go 언어를 사용하여 두 배열을 찾는 것의 유사점과 차이점을 소개합니다. 도움이 필요한 친구들에게 도움이 되길 바랍니다!
최근 프로젝트에서 작은 요구 사항이 발생했습니다. 입력은 두 개의 배열, 즉 이전 배열과 새 배열을 기준으로 새 배열과 삭제된 요소를 모두 가져와야 합니다. 예:
输入:
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의 표준 라이브러리에는 유사한 직접 비교 방법이 없습니다. 가장 간단한 방법은 물론 이전 배열의 각 요소에 대해 새 배열로 이동하는 것입니다. 발견되지 않으면 삭제한 후 새 배열의 요소를 하나씩 추가해 보세요. 기존 배열로 가서 찾아보세요. 찾을 수 없으면 새 배열이지만 이 방법은 너무 비효율적입니다. .
여기서는 집합 연산을 기반으로 한 아이디어를 사용합니다. 즉, 두 배열의 교차점과 합집합을 각각 찾는 것입니다. 합집합에서 교차점을 뺀 값은 변경된 모든 요소(새 항목 또는 삭제됨)입니다. 이 컬렉션의 요소를 순회합니다. 이전 배열에서 검색하면 삭제된 요소이고, 그렇지 않으면 새 배열에서 확실히 발견됩니다(실제로 다시 탐색할 필요가 없습니다). . 한 번) 새 요소입니다.
위의 코드는 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 언어를 사용하여 두 배열 간의 유사점과 차이점을 찾는 방법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!