Golang地图中可分解部分的最佳重构

时间:2020-09-17 15:11:54

标签: sorting go

我还很陌生,这意味着有效的分类仍然是我的工作。

我有一个功能,可以接收包装的输入,这是包装尺寸和数量的映射,并且可以接收订单的总数量。

我需要获取包装尺寸的所有整除数,删除所有小于1的值,然后选择最佳的整除数,即剩下的最少数。此数字是提供的包装尺寸中的键

注意:我在跟踪的最上方有一个函数,它消除了任何不可除的可能性。

代码:

func optimalDivisble(packs map[int]int, oq int) (int, error) {
    divisables := make(map[int]float64)
    for key := range packs {
        divisables[key] = float64(oq) / float64(key)
    }

    // Remove zero divisibles
    filteredDivisibles := make(map[int]float64)
    for key, divisable := range divisables {
        if divisable >= 1 {
            filteredDivisibles[key] = divisable
        }
    }

    //  Get divisables
    var divisableSlice []float64
    for _, filteredDivisible := range filteredDivisibles {
        divisableSlice = append(divisableSlice, filteredDivisible)
    }

    sort.Float64s(divisableSlice)
    for key, filteredDivisible := range filteredDivisibles {
        if filteredDivisible == divisableSlice[0] {
            return key, nil
        }
    }

    return 0, errors.New("Could not find a divisable for quantity")
}

有人可以帮助重构它,因为看到3 for循环似乎并不理想。什么会更惯用呢?

1 个答案:

答案 0 :(得分:2)

您可以处理包装,计算最小可分值,并在单个循环中获取其键。您不需要中间步骤:

    var minDiv float64
    var minKey int
    minSet:=false
    for key := range packs {
       divisable:=float64(oq) / float64(key)
       if divisable>=1 {
          if minDiv>divisable || !minSet {
             minDiv=divisable
             minKey=key
             minSet=true
          }
       }
    }
    // minKey is what you need
相关问题