Go 언어를 사용하여 두 배열 간의 유사점과 차이점을 찾는 방법에 대한 자세한 설명

藏色散人
풀어 주다: 2021-06-02 17:07:35
앞으로
2866명이 탐색했습니다.

다음 튜토리얼 칼럼인 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:csdn.net
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿