Go 언어를 사용하여 두 배열 간의 유사점과 차이점을 찾는 방법에 대한 자세한 설명
다음 튜토리얼 칼럼인 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Go Language의 부동 소수점 번호 작동에 사용되는 라이브러리는 정확도를 보장하는 방법을 소개합니다.

Go Crawler Colly의 대기열 스레딩 문제는 Colly Crawler 라이브러리를 GO 언어로 사용하는 문제를 탐구합니다. � ...

Go Language의 문자열 인쇄의 차이 : println 및 String () 함수 사용 효과의 차이가 진행 중입니다 ...

Go Language에서 메시지 대기열을 구현하기 위해 Redisstream을 사용하는 문제는 Go Language와 Redis를 사용하는 것입니다 ...

GO 언어에서 구조를 정의하는 두 가지 방법 : VAR과 유형 키워드의 차이. 구조를 정의 할 때 Go Language는 종종 두 가지 다른 글쓰기 방법을 본다 : 첫째 ...

GO의 어떤 라이브러리가 대기업이나 잘 알려진 오픈 소스 프로젝트에서 개발 했습니까? GO에 프로그래밍 할 때 개발자는 종종 몇 가지 일반적인 요구를 만납니다.

골란드의 사용자 정의 구조 레이블이 표시되지 않으면 어떻게해야합니까? Go Language 개발을 위해 Goland를 사용할 때 많은 개발자가 사용자 정의 구조 태그를 만날 것입니다 ...

sql.open을 사용할 때 DSN에 오류가 발생하지 않는 이유는 무엇입니까? Go Language, SQL.open ...
