«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как итеративно удалить элементы из среза в Go?

Как итеративно удалить элементы из среза в Go?

Опубликовано 7 ноября 2024 г.
Просматривать:699

How to Remove Elements from a Slice Iteratively in Go?

Итеративное удаление элементов из среза

При итерации по срезу удаление элемента внутри цикла может оказаться затруднительным из-за смещения последующие элементы. Распространенный неправильный подход — использование добавления для удаления элемента, как показано в примере ниже:

a := []string{"abc", "bbc", "aaa", "aoi", "ccc"}
for i := range a { // BAD
    if conditionMeets(a[i]) {
        a = append(a[:i], a[i 1:]...)
    }
}

Этот метод работает неправильно, поскольку цикл не учитывает сдвинутые элементы. Чтобы правильно удалить элементы во время итерации, вы можете либо использовать нисходящий цикл, либо использовать альтернативный метод, который позволяет избежать постоянных операций копирования.

Нисходящий цикл

Нисходящий цикл выполняет итерацию в обратный порядок, начиная с последнего элемента. Этот подход позволяет удалять элементы без необходимости вручную уменьшать переменные цикла:

a := []string{"abc", "bbc", "aaa", "aoi", "ccc"}
for i := len(a) - 1; i >= 0; i-- {
    if conditionMeets(a[i]) {
        a = append(a[:i], a[i 1:]...)
    }
}

Альтернативный метод для многих удалений

Если вам нужно удалить большое количество элементов, использование добавления может оказаться неэффективным из-за чрезмерного копирования. Альтернативный подход — создать новый фрагмент и скопировать только неудаляемые элементы:

a := []string{"abc", "bbc", "aaa", "aoi", "ccc"}
b := make([]string, len(a))
copied := 0
for _, s := range(a) {
    if !conditionMeets(s) {
        b[copied] = s
        copied  
    }
}
b = b[:copied]

Удаление на месте для многих удалений (общее назначение)

Техника удаления на месте включает сохранение двух индексов и присвоение не удаляемые элементы в одном и том же фрагменте с обнулением местоположений удаленных элементов:

a := []string{"abc", "bbc", "aaa", "aoi", "ccc"}
copied := 0
for i := 0; i 
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3