Почему моя функция добавления изменяет каждый элемент моего среза на новый элемент для добавления? - PullRequest
0 голосов
/ 04 марта 2019

Я делаю простую функцию простого множителя, которая может поместить срез [][]int, как

prime_factors_mult(315) => [[3,2],[5,1],[7,1]]

, но вместо этого результата я получаю [[7,1][7,1][7,1][7,1]], который впоследствии сводится к пустому срезу, потому чтоони повторяют себя.Я попытался взглянуть на него шаг за шагом, и он изменяет все значения до последнего добавления.Что я должен сделать, чтобы избежать этого?

func prime_factors_mult(x []int)(y [][]int){// Problem 36
    in :=[]int{0,0}
    var k [][]int
    for _,item := range x{
        tok := 0
        for i:=0;i<len(x);i++{
            if item == x[i]{
                tok++
            }
        }
        in[0]=item
        in[1]=tok
        k=append(k,in)
    }
    for _,item := range k{
        for i:=0;i<len(k);i++{
            if item[0] != k[i][0]{
                y = append(y,item)
            }
        }
    }
    return
}

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

Синтаксис диапазона каждый раз возвращает индекс и ссылку на значение.Вы решаете использовать ссылку оба раза, и значение изменяется, но вы продолжаете добавлять один и тот же адрес.Вот почему вы получаете только последнее значение, цикл диапазона продолжает изменять его, и у вас остается последнее значение из цикла.

подход 1:

Чтобы избежать этого, изменитеваши циклы должны быть for index := range k вместо for _,item := range k, используйте индекс из вашего цикла и добавьте k[index] вместо элемента.

подход 2:

for _, item range something {
  item := item

Если вы хотите сохранитьваш синтаксис, как есть, вы можете создать локальную переменную внутри цикла, используя переменную, которую вы получили из диапазона.Добавьте item := item в первой строке обоих ваших блоков цикла.хотя это выглядит странно, каждый раз будет выделяться новый item, и вместо этого вы будете добавлять и использовать эту переменную.

0 голосов
/ 04 марта 2019

Вы создаете свой in срез один раз, а затем каждый раз модифицируете его, поэтому каждый раз добавляете один и тот же объект к k.

Вместо этого добавляете новый срез:

k=append(k,[]int{item, tok})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...