Оптимальный способ добавить или удалить элемент среза в Go без порядка разбитых элементов - PullRequest
0 голосов
/ 12 апреля 2020

Предположим, у меня есть []struct{}, и мне нужно знать, существует ли элемент с id = A в срезе. Если существует, элемент будет удален или перемещен в индекс 0 согласно запросу в пользовательском вводе. Итак, как найти элемент в срезе golang оптимальным образом без проверки каждого элемента? Или достаточно использовать slice.contains(obj)? Затем, если элемент существует, я буду выполнять действия в соответствии с запросом в пользовательском вводе. Если запрос remove, я удалю его без нарушения порядка элементов. Но если запрос add, я переместу элемент в индекс 0.

Примечание: функция будет часто вызываться. Спасибо.

Ответы [ 2 ]

1 голос
/ 12 апреля 2020

Если вам нужно много раз проверять, то лучше один раз создать поле map[string]int из id.

И каждый раз, просто проверяйте, карта содержит это id или нет

Здесь id как ключ и срез index как значение

mp := make(map[string]int)
for idx, a := range yourStuctSlice {
    mp[a.id] = idx
}
if idx, ok := mp[id]; ok {
    // remove the element using idx
}

Если новый элемент добавлен в слайс, затем обновите карту также

mp[newElement.id] = true

Если вы хотите удалить искомый элемент, вы можете удалить его по индексу слайса

func RemoveIndex(s []yourStuct, index int) []int {
    return append(s[:index], s[index+1:]...)
}
if idx, ok := mp[id]; ok {
    yourStuctSlice = RemoveIndex(yourStuctSlice , idx)
     delete(mp , id); // Remove from map also for next search 
}
1 голос
/ 12 апреля 2020

Нетрудно написать функцию для поиска элемента путем итерации по слайсу:

func contains(s []your_struct, e int) (bool, int) {
    for idx, a := range s {
        if a.id == e {
            return true, idx
        }
    }
    return false, -1
}

Если вы собираетесь часто вызывать функцию, может быть полезно отсортировать слайс по полю id и реализовать бинарный поиск по slice из your_struct.

Если срез не очень большой, вы можете создать дополнительную структуру данных - map[int]int и сохранить индексы элементов среза на этой карте. Но в этом случае вам нужно синхронизировать содержимое вашего слайса и карты при изменении одного из них:

your_map := make(map[int]int)
if idx, ok := your_map[id]; ok {
    // ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...