Maison >développement back-end >Golang >Comment supprimer efficacement des éléments d'une tranche Go basée sur une autre tranche ?
Supprimer des éléments d'une tranche basée sur une autre tranche
Dans Go, manipuler des tranches peut être difficile, surtout lorsqu'il s'agit de supprimer des éléments en fonction sur les valeurs dans une autre tranche. Cet article aborde ce problème, explique les pièges potentiels et propose des solutions efficaces.
Description du problème
Supposons que vous ayez deux tranches : urlList et Remove. Vous souhaitez supprimer des éléments de urlList qui correspondent exactement aux éléments supprimés. Après cette opération, urlList ne doit contenir que les éléments restants.
Tentative initiale
Une approche courante consiste à parcourir urlList et à comparer chaque élément avec les éléments en suppression. Si une correspondance est trouvée, l'élément est supprimé. Cependant, cela peut ne pas fonctionner comme prévu en raison de la nature des tranches.
Le problème avec les boucles de plage
Le principal problème réside dans l'utilisation de boucles de plage dans l'itération externe. . Lorsqu'un élément est supprimé d'une tranche, tous les éléments suivants sont décalés vers la gauche pour combler le vide. Cependant, la boucle de plage ne prend pas en compte ce changement. En conséquence, des éléments qui auraient dû être vérifiés sont ignorés, entraînant une suppression incorrecte.
Solution 1 : Utiliser un compteur manuel
Pour résoudre ce problème, nous pouvons utilisez un compteur manuel pour garder une trace de l'index actuel dans la boucle. Lorsqu'un élément est supprimé, l'index est décrémenté pour garantir que les éléments décalés sont toujours vérifiés.
for i := 0; i < len(urlList); i++ { url := urlList[i] for _, rem := range remove { if url == rem { urlList = append(urlList[:i], urlList[i+1:]...) i-- // Decrement index continue } } }
Solution 2 : Itérer vers le bas
Alternativement, nous pouvons parcourir urlList dans le sens inverse. De cette façon, les éléments décalés n'affecteront pas notre boucle car ils ont déjà été traités.
for i := len(urlList) - 1; i >= 0; i-- { url := urlList[i] for _, rem := range remove { if url == rem { urlList = append(urlList[:i], urlList[i+1:]...) break } } }
Approche alternative : utiliser une carte
Pour des ensembles de données plus volumineux, utiliser une carte peut être plus efficace que parcourir des tranches. L'approche consiste à créer une carte avec des clés définies sur les éléments à supprimer et des valeurs définies sur leur nombre. Ensuite, nous pouvons parcourir urlList et vérifier si chaque élément existe dans la carte. Si c’est le cas, nous réduisons le nombre sur la carte. Lorsque le nombre d'éléments dans la carte atteint zéro, nous supprimons l'élément correspondant de urlList.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!