Aller: Ajouter si unique
Est-il un moyen de vérifier en tranches/cartes pour la présence d'une valeur?
Je voudrais ajouter une valeur à une tranche seulement si elle ne pas existent dans le secteur.
Cela fonctionne, mais il semble clair. Est-il un beter façon de le faire?
orgSlice := []int{1, 2, 3}
newSlice := []int{}
newInt := 2
newSlice = append(newSlice, newInt)
for _, v := range orgSlice {
if v != newInt {
newSlice = append(newSlice, v)
}
}
newSlice == [2 1 3]
- Re:MODIFIER - c'est la même histoire pour être valable, toute carte de clé de type chaîne qui est.
- Re:EDIT2 - si l'ordre des valeurs dans 'newSlice' n'a pas d'importance ET il sera utilisé/consommé à l'aide d'une gamme énoncé de sa construction est redondant - il suffit de gamme, les clés de la "set".
- Merci pour vos commentaires. Je suis stocker la liste des
ints
en FGA de la banque de données et pour la fin de l'interrogation, il doit être une tranche ([]int
). N'cette exigence rend ma technique initiale le meilleur choix? Les listes seront petites. - Vous pouvez éviter l'utilisation de
append()
(et tous les réaffectations) par la création de la création d'unnewslice := make([]int, len(set))
en premier lieu. Si vous faites beaucoup de ces "contient la clé ..." tests (au moins 2), la conversion de la tranche d'une carte[int]struct{} sera probablement beaucoup plus rapide, si vous faites juste un peu, une boucle dans la tranche directement est probablement mieux. - Ok, merci, j'apprécie vraiment que vous preniez le temps de vous expliquer tout cela.
Vous devez vous connecter pour publier un commentaire.
Votre approche permettrait de prendre le temps linéaire pour chaque insertion. Une meilleure approche serait d'utiliser un
map[int]struct{}
. Sinon, vous pouvez également utiliser unmap[int]bool
ou quelque chose de similaire, mais le videstruct{}
a l'avantage de ne pas occuper tout l'espace supplémentaire. Doncmap[int]struct{}
est un choix populaire pour un ensemble d'entiers.Exemple:
Plus efficace est susceptible d'être une itération sur la tranche et en ajoutant si vous ne le trouvez pas.
C'est simple et évident et rapide pour les petites listes.
En outre, il sera toujours plus vite que votre carte actuelle à base de solution. La carte à base de solution effectue une itération sur l'ensemble de la tranche n'importe quoi; cette solution revient immédiatement lorsqu'il constate que la nouvelle valeur est déjà présente. Les deux solutions comparer les éléments comme ils itérer. (Chaque carte de l'instruction d'affectation n'est certainement au moins une carte de la comparaison clé en interne.) Une carte ne serait utile que si vous pouvait le conserver dans de nombreuses insertions. Si vous le reconstruire sur chaque insertion, puis tous les avantage est perdu.
Si vous avez réellement besoin pour gérer efficacement les grandes listes, envisager de maintenir les listes dans l'ordre de tri. (Je soupçonne que la commande n'est pas question pour vous, parce que votre première solution ajoutés au début de la liste et de votre dernière solution, ajoute à la fin.) Si vous avez toujours garder les listes triées puis vous vous pouvez utiliser le tri.Fonction de recherche pour faire binaire efficace insertions.
distincting un tableau de struct :
où la struct ici est quelque chose comme :
l'objet distinctes par les champs cochés ici :