Распределить элементы из списка подмассивов в другие под массивы / работы иногда, а затем случайные ошибки - PullRequest
0 голосов
/ 17 мая 2018

У меня есть программа, которая создает список массивов.Первый массив заполняется значениями, в то время как другие массивы могут быть либо пустыми, либо нет.Если оно пустое, мы берем значение из первого массива и перемещаемся в пустой массив.Цель никогда не состоит в том, чтобы в списке был пустой массив

Array      Values
    A1 -> V1, V2, V3, V4, V5 // add extra val to whatever is nxt in line
    A2  <------|----------| //add A1[0][1] and A1[0][4] since its extra
    A3  <----------|       //add A1[0][2]
    A4  <--------------|   //add A1[0][3]

Вот что у меня есть.Что меня смущает, так это то, что индекс случайно выходит за пределы диапазона, в то время как иногда он работает, и я уверен, что есть гораздо более оптимальный и эффективный способ сделать это.Я хотел бы увидеть это.

package main

import "fmt"

func main(){

    //Create list of arrays
    something := []string{"first", "second", "third"}
    something2 := []string{""}
    something3 := []string{""}


    thisMap := make(map[int] []string, 0)


    //assign them
    thisMap[0] = something
    thisMap[1] = something2
    thisMap[2] = something3



    //loop through the maps
    for k, v := range thisMap{
        //if the key is great than 0
        if k > 0 {
            //loop through the array
            for _, items := range v {

                //if the item is empty
                if items == "" {
                    //we remove the empty string since we dont need it 
                    v = v[1:]
                    //append the k value from the first array to the k array
                    v = append(v, thisMap[0][k])

                    //We update the array and remove the item we just assigned from the initial array
                    thisMap[0] = append(thisMap[0][:k], thisMap[0][k+1:]...)

                }

            }
            //Assign the arrays back to the map
            thisMap[k] = v
        }

    }
    fmt.Println(thisMap)

}

1 Ответ

0 голосов
/ 17 мая 2018

Проблемы в этой строке:

v = append(v, thisMap[0][k])

Здесь вы предполагаете, что длина thisMap[0] равна по крайней мере k, что ложно, если, например, k равно 2 и thisMap[0] имеет только один оставленный элемент.

Поскольку итерация на парах ключ / значение карты происходит в случайном порядке, если вам повезет, порядок будет 2, 1, 0, и все будет работать хорошо. Если вам не повезло, вы можете получить проблему вне зоны досягаемости.

Вместо того, чтобы выбирать элемент в позиции k из thisMap[0], вы должны получить либо первый элемент, либо последний, либо случайный элемент, но всегда учитывайте текущую длину thisMap[0].

Мои два цента об организации кода:

  • thisMap[0] и другие записи карты явно играют разные роли в вашем алгоритме. Таким образом, вы должны назвать свои переменные и организовать свой код, чтобы отразить это. Например, вы могли бы написать функцию, которая принимает строку [] и возвращает строку map [int] [] или, возможно, даже строку [] []
  • Я думаю, что инициализация выходных списков с одной пустой строкой внутри, а удаление позже, вызывает ненужный шум, вы можете инициализировать пустые выходные списки. Кроме того, я не уверен, что реализация этой части верна!
...