web-dev-qa-db-de.com

Einzelwert am Index in Slice hinzufügen

Wenn ich habe

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

Und ich möchte array2[2] dei 6 an array1[1] davor 3 einfügen, so dass array1 ein Teil von {1, 6, 3, 4, 5} wird. Wie kann ich es tun?

Die meisten Techniken, die ich online lese, umfassen die Verwendung des :-Operators, führen jedoch dazu, dass auch die restlichen Elemente eingefügt werden. Wie kann ich einzelne Werte an einen Index in einem Slice anhängen?

5
chefcurry7

Einfacher, effizienter und logischer Weg:

  1. Stellen Sie sicher, dass array1 ausreichend Kapazität (Länge) hat, um das neue einfügbare Element aufzunehmen. Hängen Sie dazu ein einzelnes Element mit dem eingebauten append() an (egal was das ist, es wird überschrieben).
  2. Um ein Element einzufügen, müssen vorhandene Elemente verschoben (kopiert in einen Index höher) sein, um Platz für dieses Element zu schaffen, z. Verwenden des eingebauten copy() (Elemente, die Sie zuvor einfügen möchten).
  3. Setzen Sie das Element mit einer einfachen Zuordnung auf den richtigen Index.

In Code:

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)

Ausgabe (probiere es auf dem Go Playground ):

[1 6 3 4 5]
5
icza

wenn ich die Antwort von @Volker erweitere, stelle ich die Antwort hier https://play.golang.org/p/3Hla2y2ava , auch wenn Sie es testen wollen.

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)
}
2
ngurajeka

Ich fand das Fragen-Setup ziemlich schwierig zu folgen.

Umformuliert, möchten sie ein Element einfügen. Hier haben wir ein Array, in dem das Element 3 fehlt und wir möchten es einfügen.

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)
}
1
Don P

Basierend auf dem Beitrag von icza habe ich eine Funktion geschrieben, um das Slice/Array zu verschieben, das ich mit Ihnen teilen möchte:

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
}
1
fty4

Ich weiß nicht, ob es optimal ist oder nicht, aber dieser Code funktioniert für mich:

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
}

In Ihrem Fall einfach anrufen

sliceins(array1, 1, array2[2])
0
NoAngel