go自定义和使用set包处理列表 交集 并集 差集

自定义交集 并集 差集
package main

import "fmt"

func main() {
	aList := []string{"1", "2", "3", "4", "5"}
	bList := []string{"4", "5", "6", "7", "8"}

	ss := new(baseStruct)
	unionList := ss.union(aList, bList)
	intersectList := ss.intersect(aList, bList)
	diffList1, diffList2 := ss.difference(aList, bList)

	fmt.Printf("交集:%v\n", intersectList)
	fmt.Printf("并集:%v\n", unionList)
	fmt.Printf("差集(属a不属b):%v\n", diffList1)
	fmt.Printf("差集(属b不属a):%v\n", diffList2)
	//交集:[4 5]
	//并集:[1 2 3 4 5 6 7 8]
	//差集(属a不属b):[1 2 3]
	//差集(属b不属a):[6 7 8]

}


type baseStruct struct{}
//并集
func (s *baseStruct) union(outApiList, LocalDBList []string) []string {
	baseMap := make(map[string]int)

	unionList := make([]string, 0)
	for _, name := range outApiList {
		baseMap[name] ++
		unionList = append(unionList, name)
	}

	for _, name := range LocalDBList {
		//如果不在基础数据中 则加入并集列表
		if baseMap[name] == 0 {
			unionList = append(unionList, name)
		}
	}

	return unionList
}
//交集
func (s *baseStruct) intersect(outApiList, LocalDBList []string) []string {
	baseMap := make(map[string]int)
	for _, name := range outApiList {
		baseMap[name] ++
	}

	intersectList := make([]string, 0)
	for _, name := range LocalDBList {
		//如果在基础数据中 则加入交集列表
		if baseMap[name] == 1 {
			intersectList = append(intersectList, name)
		}
	}

	return intersectList
}
//求差集
func (s *baseStruct) difference(outApiList, LocalDBList []string) (addList, delList []string) {
	//查出交集 取各个差集
	baseMap := make(map[string]int)
	intersectList := s.intersect(outApiList, LocalDBList)
	for _, v := range intersectList {
		baseMap[v]++
	}

	//api不在交集列表中
	apiNotIntersect := make([]string, 0)
	for _, name := range outApiList {
		if baseMap[name] == 0 {
			apiNotIntersect = append(apiNotIntersect, name)
		}
	}

	//local不在交集列表中 
	localNotIntersect := make([]string, 0)
	for _, name := range LocalDBList {
		if baseMap[name] == 0 {
			localNotIntersect = append(localNotIntersect, name)
		}
	}

	return apiNotIntersect, localNotIntersect
}

set包处理交集 并集 差集
package main

import (
	"fmt"
	"github.com/fatih/set"
)

func main() {
	aList := []int{1, 2, 3, 4, 5}
	a := set.New(set.ThreadSafe)
	for _, v := range aList {
		a.Add(v)
	}

	bList := []int{4, 5, 6, 7, 8}
	b := set.New(set.ThreadSafe)
	for _, v := range bList {
		b.Add(v)
	}

	//并集
	unionSet := set.Union(a, b)
	fmt.Printf("并集:%v\n", unionSet)
	//并集:[4, 5, 7, 8, 6, 1, 2, 3]

	//交集
	intersectionSet := set.Intersection(a, b)
	fmt.Printf("交集:%v\n", intersectionSet)
	//交集:[4, 5]

	//差集
	diffS1S2 := set.Difference(a, b)
	fmt.Printf("差集(属a不属b):%v\n", diffS1S2)
	//差集(属a不属b):[1, 2, 3]

	diffS2S1 := set.Difference(b, a)
	fmt.Printf("差集(属b不属a):%v\n", diffS2S1)
	//差集(属b不属a):[6, 7, 8]

	//返回的是接口 需要断言
	for _,v := range unionSet.List(){
		fmt.Println(v.(int))
	}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值