Maison > développement back-end > Golang > Comment supprimer des éléments d'une tranche en langage Go

Comment supprimer des éléments d'une tranche en langage Go

青灯夜游
Libérer: 2023-01-05 19:15:57
original
6611 Les gens l'ont consulté

Méthode de suppression : 1. Interceptez la tranche pour supprimer l'élément spécifié, la syntaxe est "append(a[:i], a[i+1:]...)". 2. Créez une nouvelle tranche, filtrez les éléments à supprimer et affectez-les à la nouvelle tranche. 3. Utilisez un index d'indice pour enregistrer la position où un élément valide doit être ; parcourez tous les éléments, et lorsqu'un élément valide est rencontré, déplacez-le vers l'index et augmentez l'index de un, la position finale de l'index est la position suivante de tous ; éléments valides, et enfin faire une interception.

Comment supprimer des éléments d'une tranche en langage Go

L'environnement d'exploitation de ce tutoriel : système Windows 7, GO version 1.18, ordinateur Dell G3.

Go ne fournit pas de syntaxe ou de fonctions spéciales pour supprimer des éléments de tranche. Vous devez utiliser les caractéristiques de la tranche elle-même pour supprimer des éléments.

Il existe généralement les méthodes suivantes pour supprimer des éléments spécifiés dans une tranche. Cet article utilise []int comme exemple pour donner l'implémentation spécifique.

1. Méthode d'interception (modifier la tranche d'origine)

Ici, l'interception de la tranche permet de supprimer l'élément spécifié. Notez que lors de la suppression, les éléments suivants seront avancés, donc l'indice i doit être déplacé d'une position vers la gauche.

// DeleteSlice1 删除指定元素。
func DeleteSlice1(a []int, elem int) []int {
	for i := 0; i < len(a); i++ {
		if a[i] == elem {
			a = append(a[:i], a[i+1:]...)
			i--
		}
	}
	return a
}
Copier après la connexion

2. Méthode de copie (sans changer la tranche d'origine)

Cette méthode est la plus simple à comprendre. Réutilisez une tranche et filtrez les éléments à supprimer. L'inconvénient est qu'il faut libérer de l'espace pour une autre tranche. L'avantage est qu'il est facile à comprendre et ne modifie pas la tranche d'origine.

// DeleteSlice2 删除指定元素。
func DeleteSlice2(a []int, elem int) []int {
	tmp := make([]int, 0, len(a))
	for _, v := range a {
		if v != elem {
			tmp = append(tmp, v)
		}
	}
	return tmp
}
Copier après la connexion

3. Méthode Shift (modifier la tranche d'origine)

3.1 Méthode 1

Utilisez un index d'indice pour enregistrer la position où devrait être le prochain élément valide. Parcourez tous les éléments lorsqu’un élément valide est rencontré, déplacez-le vers l’index et augmentez l’index de un. La position finale de l'index est la position suivante de tous les éléments valides, et finalement une interception suffit. Cette méthode modifiera la tranche d'origine.

Cette méthode peut être considérée comme une amélioration par rapport à la première méthode d'interception, car chaque fois qu'un élément doit être déplacé, les performances sont meilleures.

// DeleteSlice3 删除指定元素。
func DeleteSlice3(a []int, elem int) []int {
	j := 0
	for _, v := range a {
		if v != elem {
			a[j] = v
			j++
		}
	}
	return a[:j]
}
Copier après la connexion

3.2 Méthode 2

crée une tranche, mais partage le tableau sous-jacent de la tranche d'origine. De cette manière, il n’est pas nécessaire d’allouer de l’espace mémoire supplémentaire et les modifications peuvent être effectuées directement sur la tranche d’origine.

// DeleteSlice4 删除指定元素。
func DeleteSlice4(a []int, elem int) []int {
	tgt := a[:0]
	for _, v := range a {
		if v != elem {
			tgt = append(tgt, v)
		}
	}
	return tgt
}
Copier après la connexion

4. Comparaison des performances

Supposons que notre tranche ait 0 et 1, nous voulons supprimer tous les 0.

Ici, nous testons des tranches d'une longueur de 10, 100 et 1 000 pour comparer les différences de performances des quatre implémentations ci-dessus.

La fonction de tranche générée est la suivante :

func getSlice(n int) []int {
	a := make([]int, 0, n)
	for i := 0; i < n; i++ {
		if i%2 == 0 {
			a = append(a, 0)
			continue
		}
		a = append(a, 1)
	}
	return a
}
Copier après la connexion

Le code de référence est le suivant :

func BenchmarkDeleteSlice1(b *testing.B) {
	for i := 0; i < b.N; i++ {
		_ = DeleteSlice1(getSlice(10), 0)
	}
}
func BenchmarkDeleteSlice2(b *testing.B) {
	for i := 0; i < b.N; i++ {
		_ = DeleteSlice2(getSlice(10), 0)
	}
}
func BenchmarkDeleteSlice3(b *testing.B) {
	for i := 0; i < b.N; i++ {
		_ = DeleteSlice3(getSlice(10), 0)
	}
}
func BenchmarkDeleteSlice4(b *testing.B) {
	for i := 0; i < b.N; i++ {
		_ = DeleteSlice4(getSlice(10), 0)
	}
}
Copier après la connexion

Les résultats du test sont les suivants :

La longueur de tranche d'origine est de 10 :

go test -bench=. main/slice
goos: windows
goarch: amd64
pkg: main/slice
cpu: Intel(R) Core(TM) i7-9700 CPU @ 3.00GHz
BenchmarkDeleteSlice1-8         17466486                65.07 ns/op
BenchmarkDeleteSlice2-8         14897282                85.22 ns/op
BenchmarkDeleteSlice3-8         21952129                50.78 ns/op
BenchmarkDeleteSlice4-8         22176390                54.68 ns/op
PASS
ok      main/slice      5.427s
Copier après la connexion

La longueur de tranche d'origine est de 100 :

BenchmarkDeleteSlice1-8          1652146               762.1 ns/op
BenchmarkDeleteSlice2-8          2124237               578.4 ns/op
BenchmarkDeleteSlice3-8          3161318               359.9 ns/op
BenchmarkDeleteSlice4-8          2714158               423.7 ns/op
Copier après la connexion

La longueur de tranche d'origine est de 1000 :

BenchmarkDeleteSlice1-8            56067             21915 ns/op
BenchmarkDeleteSlice2-8           258662              5007 ns/op
BenchmarkDeleteSlice3-8           432049              2724 ns/op
BenchmarkDeleteSlice4-8           325194              3615 ns/op
Copier après la connexion

5 Résumé

D'après les résultats des tests de référence, la méthode la plus performante est la méthode de décalage, et la première méthode de mise en œuvre est la meilleure. La méthode la moins performante et la plus couramment utilisée est la méthode d’interception. À mesure que la longueur de la tranche augmente, la différence de performances entre les quatre méthodes de suppression ci-dessus deviendra plus évidente.

En utilisation réelle, nous pouvons choisir en fonction des différents scénarios. Si vous ne pouvez pas modifier la tranche d'origine à l'aide de la méthode de copie, vous pouvez modifier la tranche d'origine à l'aide de la première méthode d'implémentation de la méthode shift.

【Recommandations associées : Tutoriel vidéo Go, Enseignement de la programmation

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal