附加到切片时排序?

时间:2019-02-04 16:05:55

标签: arrays sorting go

我有一个[]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以便立即对returnObj进行排序,或者是否需要预先对obj.ByteData进行排序(或对{{ 1}}之后。

1 个答案:

答案 0 :(得分:5)

在每次迭代中,请执行以下操作:

  1. 增长目标切片(可能重新分配它):

    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++
    }
    
  2. 使用标准的插入方法,通过找到一个放置源切片中每个字节的位置,来逐一保持目标排序:

    copy

    (应该通过减少复制来优化对{{1}}的调用,但这是读者的练习。)