Как удалить дубликаты элементов между срезами на Голанге - PullRequest
0 голосов
/ 07 ноября 2018

В качестве заголовка как удалить дубликаты элементов между слайсами на golang

ех.

a_array := {"1","2","3","4,"}
b_array := {"3","4"}

надежда на результат

"1","2"

Предполагается, что элементы a_array определенно имеют элементы b_array. Пожалуйста, скажите мне, как это сделать. Спасибо!

1 Ответ

0 голосов
/ 07 ноября 2018

Если вам нужно строго сравнить один срез с другим, вы можете сделать что-то вроде

func diff(a []string, b []string) []string {
    // Turn b into a map
    var m map[string]bool
    m = make(map[string]bool, len(b))
    for _, s := range b {
        m[s] = false
    }
    // Append values from the longest slice that don't exist in the map
    var diff []string
    for _, s := range a {
        if _, ok := m[s]; !ok {
            diff = append(diff, s)
            continue
        }
        m[s] = true
    }
    // Sort the resulting slice
    sort.Strings(diff)
    return diff
}

Игровая площадка Go


В качестве альтернативы, если вы хотите получить все значения из обоих срезов, которых нет в обоих, вы можете сделать

func diff(a []string, b []string) []string {
    var shortest, longest *[]string
    if len(a) < len(b) {
        shortest = &a
        longest = &b
    } else {
        shortest = &b
        longest = &a
    }
    // Turn the shortest slice into a map
    var m map[string]bool
    m = make(map[string]bool, len(*shortest))
    for _, s := range *shortest {
        m[s] = false
    }
    // Append values from the longest slice that don't exist in the map
    var diff []string
    for _, s := range *longest {
        if _, ok := m[s]; !ok {
            diff = append(diff, s)
            continue
        }
        m[s] = true
    }
    // Append values from map that were not in the longest slice
    for s, ok := range m {
        if ok {
            continue
        }
        diff = append(diff, s)
    }
    // Sort the resulting slice
    sort.Strings(diff)
    return diff
}

Тогда

fmt.Println(diff(a_array, b_array))

даст вам

[1 2]

Игровая площадка Go

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...