如何使用golang检查数组中的重复元素?

时间:2013-11-21 02:14:41

标签: go

我已经制作了一个代码来生成随机数并删除重复的代码,如下所示:

package main

import (
    "fmt"
    "math/rand"
    "time"
)

func main() {
    list := [7]int{}
    for i := 0; i < 7; i++ {
    here:
        rand.Seed(time.Now().UnixNano())
        s := rand.Intn(16)
        fmt.Println(s)
        if s != list[0] && s != list[1] && s != list[2] && s != list[3] && s != list[4] && s != list[5] && s != list[6] {
            list[i] = s
        } else {
            goto here
        }

    }
    fmt.Println("list:", list)
}

我注意到有很多重复的代码,如:

s!=list[0]&&list[1]

但是当我把它写到:

s!=list[0:6]

这是错的,我该如何正确地做到这一点?

3 个答案:

答案 0 :(得分:7)

将其存储在地图中。

像那样

rndmap := make(map[int]bool)

for len(rndmap) < YOUR_LEN {
    rndmap[rand.Intn(YOUR_MAX_RAND)] = true
}

结果图永远不会存储重复的索引。

您可以将其转换为像这样的切片

rndslice := make([]int,0)
for i, _ := range rndmap {
    rndslice = append(rndslice, i)
}

答案 1 :(得分:2)

您可以使用标准库来生成随机元素,而不会重复。

package main

import (
    "fmt"
    "math/rand"
)

func main() {
    fmt.Println(rand.Perm(16)[:7])
}

答案 2 :(得分:1)

如果您想要检查某个值的切片,请尝试使用此函数(play.golang.org):

func InSlice (arr []int, val int) (bool){
    for _, v := range(arr) {
         if v == val { return true; } 
    }    
    return false; 
}

你可以像下面这样使用它,但是你无法在play.golang.org上成功运行它,因为play.golang.org对math / rand有一个确定性的响应(在我的例子中,它是0),这将使它不会给出多个答案,迫使这段代码进入无限循环。

func main() {
    list := [7]int{}
    for i := 0; i < 7; i++ {
    here:
        rand.Seed(time.Now().UnixNano())
        s := rand.Intn(16)
        fmt.Println(s)
        if !InSlice(list[:], s) {
            list[i] = s
        } else {
            goto here
    }

}