为了账号安全,请及时绑定邮箱和手机立即绑定

在附加到切片时排序?

在附加到切片时排序?

Go
POPMUISE 2023-06-05 17:12:42
我有一个[]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应该通过减少复制来优化对的调用,但这留给读者作为练习。)


查看完整回答
反对 回复 2023-06-05
  • 1 回答
  • 0 关注
  • 102 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信