web-dev-qa-db-fra.com

Ajouter une valeur unique à l'index dans la tranche

Si j'ai

array1 := []int{1, 3, 4, 5}
array2 := []int{2, 4, 6, 8}

Et je veux insérer array2[2] i.e 6 à array1[1] i.e avant 3 pour que array1 devienne une tranche de {1, 6, 3, 4, 5}. Comment puis-je le faire?

La plupart des techniques que j'ai lues en ligne impliquent l'utilisation de l'opérateur :, mais les éléments restants sont également insérés. Comment puis-je ajouter des valeurs uniques à un index dans une tranche?

5
chefcurry7

Manière simple, efficace et logique:

  1. Assurez-vous que array1 a suffisamment de capacité (longueur) pour accueillir le nouvel élément insérable. Pour ce faire, ajoutez un seul élément en utilisant la construction append() (peu importe ce que c'est, ça va être écrasé).
  2. Pour insérer un élément, les éléments existants doivent être shifted (copiés dans un index supérieur) afin de laisser de la place à cet élément, par exemple. en utilisant la fonction copy() (éléments que vous souhaitez insérer auparavant).
  3. Définissez l'élément à l'index approprié, en utilisant un seul assignation .

Dans du code:

array1 := []int{1, 3, 4, 5}
array2 := []int{2, 4, 6, 8}

array1 = append(array1, 0)   // Step 1
copy(array1[2:], array1[1:]) // Step 2
array1[1] = array2[2]        // Step 3

fmt.Println(array1)

Sortie (essayez-le sur Go Playground ):

[1 6 3 4 5]
5
icza

étendant la réponse de @Volker, je l'ai posée ici https://play.golang.org/p/3Hla2y2ava aussi si vous voulez le tester.

package main

import "fmt"

func main() {
    array1 := []int{1, 3, 4, 5}
    array2 := []int{2, 4, 6, 8}
    temp := append([]int{array2[2]}, array1[1:]...)
    array1 = append(array1[:1], temp...)
    fmt.Println(array1)
}
2
ngurajeka

J'ai trouvé la configuration de la question assez délicate à suivre.

Reformulés, ils veulent insérer un élément. Nous avons ici un tableau où il manque l'élément 3 et nous voulons l'insérer.

package main

import (
    "fmt"
)

func main() {
    a := []int{1, 2, 4, 5, 6}
    b := 3

    // Make space in the array for a new element. You can assign it any value.
    a = append(a, 0)   
    fmt.Println(a)

    // Copy over elements sourced from index 2, into elements starting at index 3.
    copy(a[3:], a[2:])  
    fmt.Println(a)

    a[2] = b         
    fmt.Println(a)
}
1
Don P

Je ne sais pas si c'est optimal ou pas, mais ce code fonctionne pour moi:

func sliceins(arr []int, pos int, elem int) []int { //insert element before pos in slice. if pos >= len(arr) insert into tail
    if pos < 0 {
        pos = 0
    } else if pos >= len(arr) {
        pos = len(arr)
    }
    out := make([]int, len(arr)+1)
    copy(out[:pos], arr[:pos])
    out[pos] = elem
    copy(out[pos+1:], arr[pos:])
    return out
}

Dans votre cas, il suffit d'appeler

sliceins(array1, 1, array2[2])
0
NoAngel