2015-06-29 4 views
0

У меня есть словарь структуры, как это (Взято из Swift: How to declare a 2d array (grid or matrix) in Swift to allow random insert, благодаря @rintaro):Сортировка массива структур или словарь в Swift

struct Matrix2D<KeyElem:Hashable, Value> { 

    var _storage:[KeyElem:[KeyElem:Value]] = [:] 

    subscript(x:KeyElem, y:KeyElem) -> Value? { 
     get { 
      return _storage[x]?[y] 
     } 
     set(val) { 
      if _storage[x] == nil { 
       _storage[x] = [:] 
      } 
      _storage[x]![y] = val 
     } 
    } 
} 

Теперь я хотел бы отсортировать этот словарь по х, но я могу найти способ достичь этого. Может ли событие сортировать словарь? Или я могу использовать решение с Array вместо словаря?

struct Matrix2D<T> { 

    var _storage:[[T?]] = [] 

    subscript(x:Int, y:Int) -> T? { 
     get { 
      if _storage.count <= x { 
      return nil 
      } 
      if _storage[x].count <= y { 
       return nil 
      } 
      return _storage[x][y] 
     } 
     set(val) { 
      if _storage.count <= x { 
       let cols = [[T?]](count: x - _storage.count + 1, repeatedValue: []) 
       _storage.extend(cols) 
      } 
      if _storage[x].count <= y { 
       let rows = [T?](count: y - _storage[x].count + 1, repeatedValue: nil) 
       _storage[x].extend(rows) 
      } 
      _storage[x][y] = val 
     } 
    } 
} 

Благодарим за помощь!

+0

, что ваша мотивация для сортировки? если это просто для более быстрого поиска, обратите внимание, что поиск словаря уже очень быстрый (следовательно, причина, по которой ключи соответствуют «Hashable») - если бы мы знали ваши рассуждения, возможно, было бы проще предложить возможное решение. – fqdn

+0

Хорошо, я хочу использовать эту структуру для сопоставления координат с целым числом. Координаты описывают поле в сетке, целое число на сколько полей каждое поле будет перемещаться в сетке. Мне нужно отсортировать массив, что я не получу проблем, когда дело доходит до фактического перемещения полей. Конечно, я мог бы просто создать массив, содержащий все ключи _storage, чтобы получить значения в правильном порядке, но я задавался вопросом, было ли более чистое решение. Надеюсь, это даст вам представление о том, как это должно работать. – biedert

ответ

0

Словарь для определения типа коллекции, содержащий неупорядоченные пары ключ-значение.

Есть несколько решений для упорядоченных словарей с использованием массива подкладочного, смотрите, например earning-swift-ordered-dictionaries