Insert a sequential Dictionary (such as Java’s LinkedHashMap) in swift?
•
Java
A standard swift class is a dictionary, but keep the type insertion order like @ L_ 301_ 1@? If not, how will it be implemented?
Solution
I don't know one. It's an interesting problem to solve (it has been put in my standard library). In most cases, it's just a problem of maintaining the keys of a dictionary and array side by side However, for (key, value) and OD The standard operation of keys in keys will be iterated in insertion order rather than semi - random
// 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>) -> Bool { return lhs._keys != rhs._keys || lhs._dictionary != rhs._dictionary }
The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
二维码