在给定索引的切片中插入值

问题描述 投票:12回答:6

给出

array1 := []int{1, 3, 4, 5}
array2 := []int{2, 4, 6, 8}

我想在array2[2]之前即6array1[1]处插入3,即array1,以便{1, 6, 3, 4, 5}成为:的片段。我该怎么办?

我在线阅读的大多数技术都涉及到使用array1运算符,但也会导致其余元素被插入。如何在切片的索引处附加单个值?

go slice
6个回答
19
投票

简单,高效和合乎逻辑的方式:

  1. 确保append()具有足够的容量(长度)以容纳新的可插入元素。为此,请使用内置的append()附加单个元素(不管它是什么,它将被覆盖)。
  2. 要插入元素,必须将现有元素shifted(复制到更高的1个索引)以为该元素腾出空间,例如使用内置的copy()(您要插入的元素)。
  3. 使用单个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

3
投票

扩展了@Volker的答案,如果您想测试,我也将答案放在[1 6 3 4 5]

https://play.golang.org/p/3Hla2y2ava

2
投票

我发现问题设置非常棘手。

改写,他们想插入一个元素。在这里,我们有一个数组,其中缺少元素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

1
投票

以下解决方案对我有用

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:]...)...)
}

0
投票

基于icza的帖子,我写了一个函数来移动我想与您共享的切片/数组:

func insert(a []interface{}, c interface{}, i int) []interface{} {
    return append(a[:i], append([]interface{}{c}, a[i:]...)...)
}

-1
投票

我不知道它是否最佳,但是这段代码对我有用:

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
}
© www.soinside.com 2019 - 2024. All rights reserved.