Как подсчитать отдельные элементы в срезе с помощью go? - PullRequest
0 голосов
/ 27 мая 2019

Например, это фрагмент:

[1, 2, 3, 3, 4]

хотите получить единичные данные 1, 2, 4 и вернуть count = 3.

Возможно удалить дублирующиеся элементы (включая саму себя)) является идеей, но не нашел метод suitalbe.


Что я пробовал:

  func removeDuplicateItems() {
      intSlice := []int{1, 2, 3, 3, 4}
      fmt.Println(intSlice)

      keys := make(map[int]bool)
      list := []int{}
      for _, entry := range intSlice {
          if _, value := keys[entry]; !value {
              keys[entry] = true
              list = append(list, entry)
          }
      }

      fmt.Println(list)
  }

Получил

[1 2 3 3 4]
[1 2 3 4]

Ответы [ 2 ]

1 голос
/ 27 мая 2019

Я просто немного изменил вашу функцию:

func removeDuplicateItems() {
    intSlice := []int{1, 2, 3, 3, 4}
    fmt.Println(intSlice)

    keys := make(map[int]int)
    list := []int{}
    for _, entry := range intSlice {
        keys[entry]++
    }
    for k, v := range keys {
        if v == 1 {
            list = append(list, k)
        }
    }

    fmt.Println(list)
}

https://play.golang.org/p/ESFLhC4VC-l

На данный момент список не отсортирован. Если вы хотите отсортировать свой список позже, вам нужно использовать пакет sort.

1 голос
/ 27 мая 2019

Я полагаю, что действительно простой и быстрый способ получить количество уникальных значений - это использовать карту:

data := map[int]bool{}
cnt := 0 // count of unique values
for _, i := range intSlice {
    if dup, ok := data[i]; !ok {
        // we haven't seen value i before, assume it's unique
        data[i] = false // add to map, mark as non-duplicate
        cnt++ // increment unique count
    } else if !dup {
        // we have seen value i before, but this is only the second time
        cnt-- // unique count goes down here
        data[i] = true // mark this value as known duplicate
    }
}

В конце этого цикла у вас будет cnt сколичество уникальных значений, и вы можете выполнить итерацию карты data для всех ключей со значением false, чтобы получить уникальные значения, которые вы нашли в срезе.Все ключи, объединенные в основном, являются значениями в срезе, не дублируются.

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