Go语言程序计算两个切片的对称差


切片类似于数组,唯一的区别是数组是元素的固定序列,而切片的数组元素是动态的。这使得切片在各种应用中更加高效和快速。在切片中,元素是通过引用而不是值传递的。在本文中,我们将学习使用 Go 语言计算两个切片之间对称差的不同技术。

算法

  • 步骤 1 − 创建一个名为 main 的包,并在程序中声明 fmt(格式化包),其中 main 生成可执行代码,fmt 帮助格式化输入和输出。

  • 步骤 2 − 创建一个 main 函数,并在该函数中创建两个切片 slice1 和 slice2,并使用 Go 语言中的打印语句打印这些切片。

  • 步骤 3 − 从 main 函数调用对称差函数,整个程序将在辅助函数内执行。

  • 步骤 4 − 在对称差函数中创建一个 diff 切片,元素将被追加到其中。

  • 步骤 5 − 迭代循环直到 slice1 的范围,并将 found 的初始值设置为 false。

  • 步骤 6 − 迭代第二个切片直到 slice2 的范围,并检查 slice1 的元素是否等于 slice2 的元素,将 found 设置为 true 并中断循环。

  • 步骤 7 − 如果未找到元素,则将 slice1 的元素追加到 diff 切片中。

  • 步骤 8 − 迭代循环直到 slice2 的范围,并将 found 的初始值设置为 false。

  • 步骤 9 − 迭代第一个切片直到 slice1 的范围,并检查 slice2 的元素是否等于 slice1 的元素,将 found 设置为 true 并中断循环。

  • 步骤 10 − 如果未找到元素,则将 slice2 的元素追加到 diff 切片中。

  • 步骤 11 − 将 diff 切片返回到函数,并使用 fmt.Println() 函数在控制台上打印它,其中 ln 表示换行。

示例 1

在本例中,我们将学习如何使用两次 for 循环分别在 slice1 和 slice2 上计算两个切片之间的对称差,然后追加两个切片中不共有的元素。

package main

import "fmt"
func main() {
   // create slice1
   myslice1 := []int{10, 20, 30, 40, 50}
   fmt.Println("The elements of slice1 are:", myslice1)

   // create slice2
   myslice2 := []int{30, 40, 50, 60, 70}
   fmt.Println("The elements of slice2 are:", myslice2)

   // to find symmetric differance
   diff := symmetricdifference(myslice1, myslice2)

   fmt.Println("The symmetric difference of two slices is:")
   fmt.Println(diff)
}

func symmetricdifference(myslice1, myslice2 []int) []int {
   var diff []int

   // to iterate on the element of first number slice
   for _, val1 := range myslice1 {
      found := false
      // Iterate over elements in second slice
      for _, elem2 := range myslice2 {
         if val1 == elem2 {
            found = true
               break
         }
      }
      if !found {
         diff = append(diff, val1)
      }
   }
   // to iterate on the elements present in slice number 2
   for _, elem2 := range myslice2 {
      found := false
      for _, elem1 := range myslice1 {
         if elem2 == elem1 {
            found = true
               break
         }
      }
      if !found {
         diff = append(diff, elem2)
      }
   }
   // to return the symmetric difference
   return diff
}

输出

The elements of slice1 are: [10 20 30 40 50]
The elements of slice2 are: [30 40 50 60 70]
The symmetric difference of two slices is:
[10 20 60 70]

示例 2

在本例中,我们将了解如何使用 Go 语言中使用 make 函数构建的 map 计算两个切片之间的对称差,make 函数是一个内置函数。

package main

import (
   "fmt"
)

func main() {
   myslice1 := []int{10, 20, 30, 40, 50} //create slice1
   fmt.Println("The elements of slice1 are:", myslice1)
   myslice2 := []int{30, 40, 50, 60, 70} //create slice2
   fmt.Println("The elements of slice2 are:", myslice2)
   diff := symmetricdifference(myslice1, myslice2)
   fmt.Println("The symmetric difference between two slices are:")
   fmt.Println(diff)
}
func symmetricdifference(myslice1, myslice2 []int) []int {
   // Create a map to store the elements of the first slice
   map_store := make(map[int]bool)
   for _, val := range myslice1 {
      map_store[val] = true
   }
   var diff []int
   // Iterate over elements in second slice
   for _, elem := range myslice2 {
      if _, ok := map_store[elem]; !ok {
         diff = append(diff, elem)
      } else {
         delete(map_store, elem)
      }
   }
   // Add remaining keys in the map
   for key := range map_store {
      diff = append(diff, key)
   }
   return diff //return symmetric difference
}

输出

The elements of slice1 are: [10 20 30 40 50]
The elements of slice2 are: [30 40 50 60 70]
The symmetric difference between two slices are:
[60 70 10 20]

结论

我们使用两个示例执行了计算两个切片之间对称差的程序。在第一个示例中,我们对切片使用了两次 for 循环,在第二个示例中,我们使用 map 存储值并查找对称差。

更新于: 2023-07-24

379 次查看

开启您的 职业生涯

通过完成课程获得认证

开始学习
广告