Сортировать при добавлении нарезать? - PullRequest
0 голосов
/ 04 февраля 2019

У меня есть []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 заранее (или отсортировать returnOjb впоследствии).

1 Ответ

0 голосов
/ 04 февраля 2019

На каждой итерации выполните следующие действия:

  1. Увеличьте целевой фрагмент (возможно, перераспределяя его):

    numElems := len(returnObj)
    returnObj = append(returnObj, make([]byte, len(obj))...)
    
  2. Используйтестандартный подход для вставки, чтобы сохранить место назначения отсортированным, находя место для размещения каждого байта из исходного среза, один за другим:

    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 должен быть оптимизирован путем копирования меньше, но этооставлено в качестве упражнения для читателя.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...