Search for Unique Items in a Go Segment or Array

I'm pretty new, and now I'm really confused.

Say I have a list of coordinates, and let's say I have several pairs in this list of coordinates. I can’t understand in my whole life how to make a unique list. Usually in Python, I can "cheat" with sets and other built-in modules. Not so much in Go.

package main

import (
    "fmt"
    "reflect"
)

type visit struct {
    x, y int
}

func main() {
    var visited []visit
    var unique []visit

    visited = append(visited, visit{1, 100})
    visited = append(visited, visit{2, 2})
    visited = append(visited, visit{1, 100})
    visited = append(visited, visit{1, 1})

    unique = append(unique, visit{1, 1})

    fmt.Println(unique)

    // Go through the visits and find the unique elements
    for _, v := range visited {
        for _, u := range unique {

            fmt.Printf("Here unique: %v\n", unique)
            fmt.Printf("Comparing %v to %v is %v\n", v, u, reflect.DeepEqual(v, u))

            if reflect.DeepEqual(v, u) {
                fmt.Println("Skip")
            } else {
                unique = append(unique, v)
            }
        }
    }

    fmt.Println(unique)
}

+4
source share
3 answers

. , , visited unique, , unique . , unique , , for "". , , , none unique.

, a struct Go , . visit 2 int , , visit =, , reflect.DeepEqual(). . Spec: :

, . , blank .

, , :

visited := []visit{
    visit{1, 100},
    visit{2, 2},
    visit{1, 100},
    visit{1, 1},
}
var unique []visit

for _, v := range visited {
    skip := false
    for _, u := range unique {
        if v == u {
            skip = true
            break
        }
    }
    if !skip {
        unique = append(unique, v)
    }
}

fmt.Println(unique)

( Go Playground):

[{1 100} {2 2} {1 1}]

Alternative

, Go , map[visit]bool . ! , visit , (. ).

visited := []visit{
    visit{1, 100},
    visit{2, 2},
    visit{1, 100},
    visit{1, 1},
}
unique := map[visit]bool{}

for _, v := range visited {
    unique[v] = true
}

fmt.Println(unique)

( ):

map[{2 2}:true {1 1}:true {1 100}:true]

"" - .

visit , . :

var unique []visit
m := map[visit]bool{}

for _, v := range visited {
    if !m[v] {
        m[v] = true
        unique = append(unique, v)
    }
}

fmt.Println(unique)

( , Go Playground):

[{1 100} {2 2} {1 1}]

, : m[v] true, v ( true - , ). v , m[v] , false bool, , v . . Spec: :

a M:

... nil , a[x] M

+8

, map . -

visited := make(map[visit]Boolean)

.

visited[visit]=true

, ,

for k, _ := range visited {
    unique = append(unique, k)
}
+2

I think you can use the help to solve this puzzle.

https://play.golang.org/p/b7JtHYQ3N8

package main

import (
    "fmt"
)

type visit struct {
    x, y int
}

func main() {
    var visited []visit
    var unique []visit

    uniqueMap := map[visit]int{}

    visited = append(visited, visit{1, 100})
    visited = append(visited, visit{2, 2})
    visited = append(visited, visit{1, 100})
    visited = append(visited, visit{1, 1})

    for _, v := range visited {
        if _, exist := uniqueMap[v]; !exist {
            uniqueMap[v] = 1
            unique = append(unique, v)
        } else {
            uniqueMap[v]++
        }
    }
    fmt.Printf("Uniques: %v\nMaps:%v\n", unique, uniqueMap)
}
+1
source

Source: https://habr.com/ru/post/1618740/


All Articles