douyouming9180 2016-08-01 14:31
浏览 97
已采纳

比较两个切片并删除Golang中的唯一值

I have this but it is not working properly :

var i int
var names = []string{"F5", "F7", "C6", "H5", "G5"}
var board = []string{"B4", "D4", "G5", "F5", "F7", "C6"}

for i = 0; i < len(names)-1; i++ {
    for k := 0; k < len(board)-1; k++ {
        if names[i] != board[k] {
            names = append(names[:i], names[i+1:]...)
        }
    }
}
fmt.Printf("%s ", names[i])
  • 写回答

3条回答 默认 最新

  • doumaikuang4202 2016-08-03 07:53
    关注

    You need the intersection of two slices (delete the unique values from the first slice), try this working sample code (and notice the i++):

    package main
    
    import "fmt"
    
    func main() {
        names := []string{"F5", "F7", "C6", "H5", "G5"}
        board := []string{"B4", "D4", "G5", "F5", "F7", "C6"}
        for i := 0; i < len(names); {
            exist := false
            for _, b := range board {
                if b == names[i] {
                    exist = true
                    break
                }
            }
            if !exist {
                names = append(names[:i], names[i+1:]...) // delete names[i]
            } else {
                i++
            }
        }
        fmt.Println(names) // [F5 F7 C6 G5]
    }
    

    output:

    [F5 F7 C6 G5]
    

    Also you may use this for the intersection of two slices with new result, try this working sample code:

    package main
    
    import "fmt"
    
    func main() {
        names := []string{"F5", "F7", "C6", "H5", "G5"}
        board := []string{"B4", "D4", "G5", "F5", "F7", "C6"}
        result := make([]string, 0, 11)
        for _, v := range names {
            exist := false
            for _, w := range board {
                if v == w {
                    exist = true
                    break
                }
            }
            if exist {
                result = append(result, v)
            }
        }
        fmt.Println(result) // [F5 F7 C6 G5]
    }
    

    output:

    [F5 F7 C6 G5]
    

    or if you need The union of two slices, try this working sample code:

    package main
    
    import "fmt"
    
    func main() {
        names := []string{"F5", "F7", "C6", "H5", "G5"}
        board := []string{"B4", "D4", "G5", "F5", "F7", "C6"}
        for _, b := range board {
            exist := false
            for _, n := range names {
                if n == b {
                    exist = true
                    break
                }
            }
            if !exist {
                names = append(names, b)
            }
        }
        fmt.Println(names) // [F5 F7 C6 H5 G5 B4 D4]
    }
    

    output:

    [F5 F7 C6 H5 G5 B4 D4]
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥20 java-OJ-健康体检
  • ¥15 rs485的上拉下拉,不会对a-b<-200mv有影响吗,就是接受时,对判断逻辑0有影响吗
  • ¥15 使用phpstudy在云服务器上搭建个人网站
  • ¥15 应该如何判断含间隙的曲柄摇杆机构,轴与轴承是否发生了碰撞?
  • ¥15 vue3+express部署到nginx
  • ¥20 搭建pt1000三线制高精度测温电路
  • ¥15 使用Jdk8自带的算法,和Jdk11自带的加密结果会一样吗,不一样的话有什么解决方案,Jdk不能升级的情况
  • ¥15 画两个图 python或R
  • ¥15 在线请求openmv与pixhawk 实现实时目标跟踪的具体通讯方法
  • ¥15 八路抢答器设计出现故障