Maison >développement back-end >Golang >Comment supprimer efficacement des éléments d'une tranche Go basée sur une autre tranche ?

Comment supprimer efficacement des éléments d'une tranche Go basée sur une autre tranche ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-20 14:32:10172parcourir

How to Efficiently Remove Elements from a Go Slice Based on Another Slice?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn