web-dev-qa-db-fra.com

Comment supprimer un élément d'un tableau dans golang

fmt.Println("Enter position to delete::")
fmt.Scanln(&pos)

new_arr:=make([]int,(len(arr)-1))
k:=0
for i:=0;i<(len(arr)-1);{
  if(i!=pos){
    new_arr[i]=arr[k]
    k++
    i++
  }else{
    k++
  }
}

for i:=0;i<(len(arr)-1);i++{
    fmt.Println(new_arr[i])
}

}

J'utilise cette commande pour supprimer un élément d'un tableau, mais cela ne fonctionne pas, merci de le suggérer.

27
Anchal Sarraf

L'ordre est important

Si vous souhaitez que votre tableau reste ordonné, vous devez déplacer tous les éléments situés à droite de l'index de suppression de un à gauche. Espérons que cela peut être fait facilement à Golang:

func remove(slice []int, s int) []int {
    return append(slice[:s], slice[s+1:]...)
}

Cependant, cela est inefficace car vous risquez de devoir déplacer tous les éléments, ce qui est coûteux.

L'ordre n'est pas important

Si vous ne vous souciez pas de la commande, vous avez la possibilité beaucoup plus rapide d'échanger l'élément à supprimer avec celui situé à la fin de la tranche, puis de renvoyer les n-1 premiers éléments:

func remove(s []int, i int) []int {
    s[len(s)-1], s[i] = s[i], s[len(s)-1]
    return s[:len(s)-1]
}

Avec la méthode de redimensionnement, vider un tableau de 1 000 000 d’éléments prend 224 secondes, avec celui-ci, il ne prend que 0,06 ns. Je soupçonne qu'en interne, go ne change que la longueur de la tranche, sans la modifier.

Modifier 1

Notes rapides basées sur les commentaires ci-dessous (merci à eux!).

Comme le but est de supprimer un élément, lorsque l'ordre n'a pas d'importance, un seul échange est nécessaire, le second est perdu:

func remove(s []int, i int) []int {
    s[i] = s[len(s)-1]
    // We do not need to put s[i] at the end, as it will be discarded anyway
    return s[:len(s)-1]
}

De plus, cette réponse n'effectue pas bounds-checking . Il attend un index valide en entrée. Cela signifie que des valeurs négatives ou des indices supérieurs ou égaux à len (s) provoqueront une panique. Les tranches et les tableaux étant indexés sur 0, la suppression du n-ème élément d'un tableau implique de fournir une entrée n-1 . Pour supprimer le premier élément, appelez remove (s, 0) , pour supprimer le second, appelez remove (s, 1) , etc., etc.

61
T. Claverie

Point mineur (code golf), mais dans le cas où l'ordre n'a pas d'importance, vous n'avez pas besoin d'échanger les valeurs. Remplacez simplement la position du tableau en cours de suppression par un duplicata de la dernière position, puis renvoyez un tableau tronqué. 

func remove(s []int, i int) []int {
    s[i] = s[len(s)-1]
    return s[:len(s)-1]
}

Même résultat.

19
David

supprimer un élément de la tranche:

package main

import (
    "fmt"
)

func RemoveIndex(s []int, index int) []int {
    return append(s[:index], s[index+1:]...)
}

func main() {
    all := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
    fmt.Println(all) //[0 1 2 3 4 5 6 7 8 9]
    n := RemoveIndex(all, 5)
    fmt.Println(n) //[0 1 2 3 4 6 7 8 9]
}
7
user6169399

Nul besoin de vérifier chaque élément, sauf si vous vous souciez de son contenu et que vous pouvez utiliser slice append. Essaye le

pos := 0
arr := []int{1, 2, 3, 4, 5, 6, 7, 9}
fmt.Println("input your position")
fmt.Scanln(&pos)
/* you need to check if negative input as well */
if (pos < len(arr)){
    arr = append(arr[:pos], arr[pos+1:]...)
} else {
    fmt.Println("position invalid")
}
0
GoGo