给出
array1 := []int{1, 3, 4, 5}
array2 := []int{2, 4, 6, 8}
我想在array2[2]
之前即6
的array1[1]
处插入3
,即array1
,以便{1, 6, 3, 4, 5}
成为:
的片段。我该怎么办?
我在线阅读的大多数技术都涉及到使用array1
运算符,但也会导致其余元素被插入。如何在切片的索引处附加单个值?
简单,高效和合乎逻辑的方式:
append()
具有足够的容量(长度)以容纳新的可插入元素。为此,请使用内置的append()
附加单个元素(不管它是什么,它将被覆盖)。copy()
(您要插入的元素)。copy()
将元素设置为适当的索引。使用代码:
assignment
输出(在array1 := []int{1, 3, 4, 5}
array2 := []int{2, 4, 6, 8}
array1 = append(array1, 0) // Step 1
copy(array1[2:], array1[1:]) // Step 2
array1[1] = array2[2] // Step 3
fmt.Println(array1)
上尝试):
Go Playground
扩展了@Volker的答案,如果您想测试,我也将答案放在[1 6 3 4 5]
。
https://play.golang.org/p/3Hla2y2ava
我发现问题设置非常棘手。
改写,他们想插入一个元素。在这里,我们有一个数组,其中缺少元素package main
import "fmt"
func main() {
array1 := []int{1, 3, 4, 5}
array2 := []int{2, 4, 6, 8}
temp := append([]int{array2[2]}, array1[1:]...)
array1 = append(array1[:1], temp...)
fmt.Println(array1)
}
,我们想将其插入。
3
以下解决方案对我有用
package main
import (
"fmt"
)
func main() {
a := []int{1, 2, 4, 5, 6}
b := 3
// Make space in the array for a new element. You can assign it any value.
a = append(a, 0)
fmt.Println(a)
// Copy over elements sourced from index 2, into elements starting at index 3.
copy(a[3:], a[2:])
fmt.Println(a)
a[2] = b
fmt.Println(a)
}
您可以通过空接口使它更通用
func insert(a []int, c int, i int) []int {
return append(a[:i], append([]int{c}, a[i:]...)...)
}
基于icza的帖子,我写了一个函数来移动我想与您共享的切片/数组:
func insert(a []interface{}, c interface{}, i int) []interface{} {
return append(a[:i], append([]interface{}{c}, a[i:]...)...)
}
我不知道它是否最佳,但是这段代码对我有用:
package main
import "fmt"
func main() {
s := []string{"a", "c", "d"}
shiftArray(&s, 1, "b")
fmt.Println(s)
}
func shiftArray(array *[]string, position int, value string) {
// extend array by one
*array = append(*array, "")
// shift values
copy((*array)[position+1:], (*array)[position:])
// insert value
(*array)[position] = value
}
在您的情况下,只需致电
func sliceins(arr []int, pos int, elem int) []int { //insert element before pos in slice. if pos >= len(arr) insert into tail
if pos < 0 {
pos = 0
} else if pos >= len(arr) {
pos = len(arr)
}
out := make([]int, len(arr)+1)
copy(out[:pos], arr[:pos])
out[pos] = elem
copy(out[pos+1:], arr[pos:])
return out
}