Есть ли стандартный класс быстрого поиска, который является Словарем, но сохраняет ключи в порядке ввода, например Java's LinkedHashMap? Если нет, как можно реализовать?Словарь вставки-заказа (например, LinkedHashMap от Java) в Swift?
14
A
ответ
19
Не знал об одном, и это была интересная проблема для решения (уже поместила ее в мою стандартную библиотеку). В основном это вопрос сохранения словаря и массива ключей бок о бок. Но стандартные операции, такие как for (key, value) in od
и for key in od.keys
, будут повторяться в порядке вставки, а не в случайном порядке.
// OrderedDictionary behaves like a Dictionary except that it maintains
// the insertion order of the keys, so iteration order matches insertion
// order.
struct OrderedDictionary<KeyType:Hashable, ValueType> {
private var _dictionary:Dictionary<KeyType, ValueType>
private var _keys:Array<KeyType>
init() {
_dictionary = [:]
_keys = []
}
init(minimumCapacity:Int) {
_dictionary = Dictionary<KeyType, ValueType>(minimumCapacity:minimumCapacity)
_keys = Array<KeyType>()
}
init(_ dictionary:Dictionary<KeyType, ValueType>) {
_dictionary = dictionary
_keys = map(dictionary.keys) { $0 }
}
subscript(key:KeyType) -> ValueType? {
get {
return _dictionary[key]
}
set {
if newValue == nil {
self.removeValueForKey(key)
}
else {
self.updateValue(newValue!, forKey: key)
}
}
}
mutating func updateValue(value:ValueType, forKey key:KeyType) -> ValueType? {
let oldValue = _dictionary.updateValue(value, forKey: key)
if oldValue == nil {
_keys.append(key)
}
return oldValue
}
mutating func removeValueForKey(key:KeyType) {
_keys = _keys.filter { $0 != key }
_dictionary.removeValueForKey(key)
}
mutating func removeAll(keepCapacity:Int) {
_keys = []
_dictionary = Dictionary<KeyType,ValueType>(minimumCapacity: keepCapacity)
}
var count: Int { get { return _dictionary.count } }
// keys isn't lazy evaluated because it's just an array anyway
var keys:[KeyType] { get { return _keys } }
// values is lazy evaluated because of the dictionary lookup and creating a new array
var values:GeneratorOf<ValueType> {
get {
var index = 0
return GeneratorOf<ValueType> {
if index >= self._keys.count {
return nil
}
else {
let key = self._keys[index]
index++
return self._dictionary[key]
}
}
}
}
}
extension OrderedDictionary : SequenceType {
func generate() -> GeneratorOf<(KeyType, ValueType)> {
var index = 0
return GeneratorOf<(KeyType, ValueType)> {
if index >= self._keys.count {
return nil
}
else {
let key = self._keys[index]
index++
return (key, self._dictionary[key]!)
}
}
}
}
func ==<Key: Equatable, Value: Equatable>(lhs: OrderedDictionary<Key, Value>, rhs: OrderedDictionary<Key, Value>) -> Bool {
return lhs._keys == rhs._keys && lhs._dictionary == rhs._dictionary
}
func !=<Key: Equatable, Value: Equatable>(lhs: OrderedDictionary<Key, Value>, rhs: OrderedDictionary<Key, Value>) -> Bool {
return lhs._keys != rhs._keys || lhs._dictionary != rhs._dictionary
}
Смежные вопросы
- 1. Как преобразовать Java LinkedHashMap в Scala LinkedHashMap?
- 2. Реализация LinkedHashMap в Java
- 3. Сортировка LinkedHashMap в Java
- 4. Общий словарь в Swift
- 5. Словарь в Swift
- 6. Клонирование java LinkedHashMap
- 7. Словарь фильтров В Swift
- 8. Софт Ссылка LinkedHashMap в Java?
- 9. Опубликовать словарь от Swift до PHP
- 10. Как мутировать Swift Словарь Словарь
- 11. Swift: Добавить в словарь
- 12. Заполняющий словарь в Swift
- 13. Словарь Значения в Swift
- 14. Словарь словарей в Swift
- 15. AnyValue в Swift словарь
- 16. Swift: flatMap в словарь
- 17. Сериализация/десериализация LinkedHashMap (android) java
- 18. Визуализация TreeMap и LinkedHashMap в Java
- 19. Java LinkedHashMap: какая разница в этих двух?
- 20. Объявить именованный тип, например, словарь
- 21. Как отсортировать словарь в Swift
- 22. Невозможно добавить элементы в LinkedHashMap в Java
- 23. Сортировочный словарь в Swift 3
- 24. Swift словарь массив
- 25. Как реализация LinkedHashMap отличается от HashMap?
- 26. JUnit порядок LinkedHashMap Java 8
- 27. Безопасная реализация Java Thread LinkedHashMap?
- 28. Удаление записей из Java LinkedHashMap
- 29. Java - коллекция с атрибутами LinkedHashMap
- 30. Итератор от определенного объекта в LinkedHashMap
Выглядит отлично! У вашего метода updateValue есть ошибка - если пользователь вызывает это с помощью нового ключа, '_keys' не будет обновляться. –
@NateCook исправлена, спасибо, что заметили это. –
Упрощенный, но я хотел бы видеть тот, который идеально взаимозаменяем с регулярным синтаксисом «Словарь» и расширяет «Словарь», поэтому я могу использовать его взаимозаменяемо с другим кодом, для которого требуется «Словарь» (например, 'Alamofire''s 'Parameter'' enum') –