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