如何从 Golang 中的 Slice 中删除元素
技术问答
294 人阅读
|
0 人回复
|
2023-09-12
|
. y- m5 i' a0 Y5 [: m* Y; J
- fmt.Println("Enter position to delete::")fmt.Scanln(&pos)new_arr := make([]int,(len(arr) - 1))k := 0for i := 0; i 我正在使用这个命令从 Slice 删除元素,但不起作用,请提出建议。 b* Z x- V3 Z" H3 {6 \
- - o; f) P7 U$ y5 d, G# |
- 解决方案: $ w4 k; x$ Q" n& P; Z: p
- 订单事项
, G7 \7 E* J6 I! Y - 如果要保持数组有序,请将删除索引右侧的所有元素向左移动。希望这能在 Golang 轻松完成:[code]func remove(slice []int,s int) []int return append(slice[:s],slice[s 1:]...)}
4 N: O* { i- q5 t. H+ d' y/ S 但这是低效的,因为你最终可能会移动所有的元素,这是昂贵的。
3 @& i7 G( F. x' }% v顺序不重要
5 E8 L! W# e4 ]- f如果不关心排名,可以更快地将要删除的元素替换为切片末尾的元素,然后返回 n-1 第一个元素:8 Q, h+ d6 R& }0 p$ G3 B
func remove(s []int,i int) []int s = s[len(s)-1] return s[:len(s)-1]}; ^/ T' l$ X9 k( O4 a
使用重新切片的方法,需要224秒才能清空 1000 00 元素的数组,而这只需要 0.06 ns。5 C/ P& N; _. ]( W' q! N
答案不执行边界检查。它需要一个有效的索引作为输入。这意味着负值或索引大于或等于初始值len(s)将导致 Go 恐慌。
2 G. \' `* f6 \4 c# e- S切片和数组是 0 索引,删除数组的第 n 个元素意味着提供输入n-1。删除第一个元素,请调用remove(s,0),删除第二个元素,请调用remove(s,1),依此类推。 |
|
|
|
|
|