我还很陌生,这意味着有效的分类仍然是我的工作。
我有一个功能,可以接收包装的输入,这是包装尺寸和数量的映射,并且可以接收订单的总数量。
我需要获取包装尺寸的所有整除数,删除所有小于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循环似乎并不理想。什么会更惯用呢?
答案 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