Странное поведение добавления в двухмерном срезе - PullRequest
0 голосов
/ 19 апреля 2020

Я немного новичок в Go языке, и пытаюсь создать функцию, которая подразделяет срез на несколько срезов с почти равными размерами. В случае, если размер основного слайса не вписывается в число подрезов, я планирую перераспределить оставшиеся элементы в подрежимы в порядке.

Я построил следующий код:

package main

import (
    "fmt"
    stc "strconv"
    "strings"
)

func main() {
    myslice := make([]int, 12)
    myslice = []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
    fmt.Println("Original Slice = ", myslice)
    newdiv := subslices(myslice, 4)
    fmt.Println(newdiv)
}

func subslices(sl []int, dividnet int) [][]int {
    var res [][]int

    minsize := len(sl) / dividnet

    for i := 0; i < dividnet; i++ {
        res = append(res, sl[i*minsize:i*minsize+minsize])
    }

    for i := 0; i < dividnet; i++ {
        fmt.Printf("res[%d] = %v\n", i, res[i])
    }

     fmt.Println(res)
     if rem := len(sl) % dividnet; rem != 0 {
        fmt.Println("remaining elements = ", rem)
        for j := 0; j < rem; j++ {
            tobeadd := sl[minsize*dividnet+j]
            fmt.Println("element to be added = ", tobeadd)
            fmt.Printf("res[%d] before append = %v\n", j, res[j])
            res[j] = append(res[j], tobeadd)
            fmt.Printf("res[%d] after append = %v\n", j, res[j])
     }
     }
    return res
}
func gentwodim(x, y int) [][]int {
    res := make([][]int, x)
    for z := range res {
        res[z] = make([]int, y)
    }

    for i := 0; i < x; i++ {
        for j := 0; j < y; j++ {
            res[i][j] = i + j
        }
    }
    return res
}

Сэмпл в Go Воспроизведение сэмпла вышеуказанного кода


Вывод кода выглядит следующим образом:

res[0] = [1 2]
res[1] = [3 4]
res[2] = [5 6]
res[3] = [7 8]
[[1 2] [3 4] [5 6] [7 8]]
remaining elements =  2
element to be added =  9
res[0] before append = [1 2]
res[0] after append = [1 2 9]  // up to this step the code works fine
element to be added =  10
res[1] before append = [9 4]   // I did not get why res[1] is changed by replacing 3 with 9
res[1] after append = [9 4 10]
[[1 2 9] [9 4 10] [10 6] [7 8]]

Однако, после добавления первого оставшегося элемента, который показан в res[0] after append = [1 2 9], 2-й подрезок изменяется, как показано с res[1] = [3 4] на res[1] before append = [9 4]. Я попытался отладить и понять, что я пропустил или здесь неправильно, но не смог.

Буду признателен за вашу поддержку.

1 Ответ

0 голосов
/ 19 апреля 2020

Избегайте проблемы, распределяя «лишние» значения при нарезке:

func subslices(sl []int, dividnet int) [][]int {
    var res [][]int
    var i int
    for len(sl) > 0 {
        i = len(sl) / (dividnet - len(res))
        res = append(res, sl[:i])
        sl = sl[i:]
    }
    return res
}
...