猿问

在附加到切片时排序?

我有一个[]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 []byte



func (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


POPMUISE
浏览 104回答 1
1回答

慕工程0101907

在每次迭代中,执行以下操作:增长目标切片(可能重新分配它):numElems := len(returnObj)returnObj = append(returnObj, make([]byte, len(obj))...)使用标准的插入方法通过找到一个位置来逐个放置源切片中的每个字节来保持目标排序:for _, b := range obj {&nbsp; i := sort.Search(numElems, func (i int) bool {&nbsp; &nbsp; return returnObj[i] >= b&nbsp; }&nbsp; if i < numElems {&nbsp; &nbsp; copy(returnObj[i+1:], returnObj[i:])&nbsp; }&nbsp; returnObj[i] = b&nbsp; numElems++}(copy应该通过减少复制来优化对的调用,但这留给读者作为练习。)
随时随地看视频慕课网APP

相关分类

Go
我要回答