"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Cómo eliminar elementos de un sector de forma iterativa en Go?

¿Cómo eliminar elementos de un sector de forma iterativa en Go?

Publicado el 2024-11-07
Navegar:725

How to Remove Elements from a Slice Iteratively in Go?

Eliminar elementos de un sector de forma iterativa

Al iterar sobre un sector, eliminar un elemento dentro del bucle puede ser complicado debido al cambio de elementos posteriores. Un enfoque incorrecto común es utilizar append para eliminar un elemento, como se ve en el siguiente ejemplo:

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

Este método no funciona correctamente porque el bucle no tiene en cuenta los elementos desplazados. Para eliminar elementos correctamente durante la iteración, puede utilizar un bucle descendente o emplear un método alternativo que evite operaciones de copia constantes.

Bucle descendente

Un bucle descendente itera en orden inverso, comenzando desde el último elemento. Este enfoque le permite eliminar elementos sin tener que disminuir manualmente las variables del bucle:

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:]...)
    }
}

Método alternativo para muchas eliminaciones

Si necesita eliminar una gran cantidad de elementos, usar append puede resultar ineficaz debido a la copia excesiva. Un enfoque alternativo es crear un nuevo segmento y copiar solo los elementos no extraíbles:

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]

Eliminación in situ para muchas eliminaciones (propósito general)

Una técnica de eliminación in situ implica mantener dos índices y asignar no elementos extraíbles en el mismo segmento mientras se ponen a cero las ubicaciones de los elementos eliminados:

a := []string{"abc", "bbc", "aaa", "aoi", "ccc"}
copied := 0
for i := 0; i 
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3