我有一个[]byte我需要按升序排序。我得到一个包含项目的对象,然后迭代数组以创建返回的对象:// unfortunately, for some obscure reason I can't change the data types of the caller and the object from the function call are different, although both are []byte underneath (...)type ID []byte// in another package:type ByteInterface []bytefunc (c *Store) GetAll() ByteInterface { returnObj := make([]ByteInterface,0) obj, err := GetData() // err handling for _, b := range obj.IDs { returnObj = append(returnObj, ByteInterface(b)) } return returnObj}所以我问自己是否有可能立即进行排序,或者我是否需要预先排序append(或事后排序)。returnObjobj.ByteDatareturnOjb
1 回答
慕工程0101907
TA贡献1887条经验 获得超5个赞
在每次迭代中,执行以下操作:
增长目标切片(可能重新分配它):
numElems := len(returnObj)
returnObj = append(returnObj, make([]byte, len(obj))...)
使用标准的插入方法通过找到一个位置来逐个放置源切片中的每个字节来保持目标排序:
for _, b := range obj {
i := sort.Search(numElems, func (i int) bool {
return returnObj[i] >= b
}
if i < numElems {
copy(returnObj[i+1:], returnObj[i:])
}
returnObj[i] = b
numElems++
}
(copy应该通过减少复制来优化对的调用,但这留给读者作为练习。)
- 1 回答
- 0 关注
- 102 浏览
添加回答
举报
0/150
提交
取消