slice.go 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. package utils
  2. // RemoveRepByLoop 通过双重循环来过滤重复元素(时间换空间)
  3. func RemoveRepByLoop(slc []int64) []int64 {
  4. var result []int64 // 存放结果
  5. for i := range slc {
  6. flag := true
  7. for j := range result {
  8. if slc[i] == result[j] {
  9. flag = false // 存在重复元素,标识为false
  10. break
  11. }
  12. }
  13. if flag { // 标识为false,不添加进结果
  14. result = append(result, slc[i])
  15. }
  16. }
  17. return result
  18. }
  19. // RemoveRepByMap 通过字典来过滤(空间换时间)
  20. func RemoveRepByMap(slc []int64) []int64 {
  21. var result []int64
  22. tempMap := map[int64]byte{} // 存放不重复主键
  23. for _, e := range slc {
  24. l := len(tempMap)
  25. tempMap[e] = 0
  26. if len(tempMap) != l { // 加入map后,map长度变化,则元素不重复
  27. result = append(result, e)
  28. }
  29. }
  30. return result
  31. }
  32. // RemoveRep 元素去重
  33. func RemoveRep(slc []int64) []int64 {
  34. if len(slc) < 1024 {
  35. // 切片长度小于1024(数字不是特别精准)的时候,循环来过滤
  36. return RemoveRepByLoop(slc)
  37. } else {
  38. // 大于的时候,通过map来过滤
  39. return RemoveRepByMap(slc)
  40. }
  41. }