"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 se mueve un elemento de sector en Go sin crear duplicados?

¿Cómo se mueve un elemento de sector en Go sin crear duplicados?

Publicado el 2024-11-10
Navegar:275

How do you move a slice item in Go without creating duplicates?

Mover un elemento de sector dentro de Go: comprender las técnicas correctas

Atravesar sectores en Go a menudo implica reorganizar sus elementos. Intentar mover directamente un elemento de una posición a otra puede generar resultados inesperados, como se demuestra en el fragmento de código proporcionado:

slice := []int{0,1,2,3,4,5,6,7,8,9}

indexToRemove := 1
indexWhereToInsert := 4

slice = append(slice[:indexToRemove], slice[indexToRemove 1:]...)
newSlice := append(slice[:indexWhereToInsert], 1)
slice = append(newSlice, slice[indexWhereToInsert:]...)

Este enfoque pretende cambiar el elemento en indexToRemove a indexWhereToInsert, pero el resultado muestra dos copias del elemento movido. El error radica en la forma en que se retira e inserta el artículo. Exploremos un enfoque alternativo:

Usar funciones personalizadas para la manipulación de elementos

En lugar de modificar manualmente el segmento, podemos crear funciones dedicadas para la inserción y eliminación:

func insertInt(array []int, value int, index int) []int {
    return append(array[:index], append([]int{value}, array[index:]...)...)
}

func removeInt(array []int, index int) []int {
    return append(array[:index], array[index 1:]...)
}

Mover elementos con precisión

Con estas funciones auxiliares, mover un elemento es sencillo:

func moveInt(array []int, srcIndex int, dstIndex int) []int {
    value := array[srcIndex]
    return insertInt(removeInt(array, srcIndex), value, dstIndex)
}

Implementación y resultados de muestra

func main() {
    slice := []int{0,1,2,3,4,5,6,7,8,9}

    fmt.Println("Original slice:", slice)

    slice = insertInt(slice, 2, 5)
    fmt.Println("After insertion:", slice)

    slice = removeInt(slice, 5)
    fmt.Println("After removal:", slice)

    slice = moveInt(slice, 1, 4)
    fmt.Println("After moving:", slice)
}

Salida:

Original slice: [0 1 2 3 4 5 6 7 8 9]
After insertion: [0 1 2 3 4 2 5 6 7 8 9]
After removal: [0 1 2 3 4 5 6 7 8 9]
After moving: [0 2 1 3 4 5 6 7 8 9]

Este enfoque cambia correctamente el elemento del índice 1 al índice 4, lo que genera el resultado esperado.

Ú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