Sözlük olan standart bir sınıf var mı, ancak anahtarları Java's LinkedHashMap gibi ekleme sırasına göre mi saklıyor? Yoksa, nasıl uygulanacak? Çoğunlukla bu sadece bir sözlük sürdürmenin meselesi ve anahtarların bir dizi var (zaten şeyler benim standart kütüphanede koymak)Eklenti Sipariş Sözlüğü (Java'nın LinkedHashMap'i gibi) Swift'de mi?
14
A
cevap
19
birinin bilmiyordum ve çözmek için ilginç bir sorun oldu yan-yana. Ancak, for (key, value) in od
ve for key in od.keys
gibi standart işlemler, yarı rastgele bir şekilde değil, ekleme sırasına göre yinelenir.
// 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
}
İlgili konular
- 1. sıralama sözlüğü
- 2. Bitirme Eşzamanlı Sözlüğü
- 3. Dize ile Son Sözlüğü Ayıkla Özgü Sözlüğü
- 4. ZIP kafası karışmış. Eklenti bozuk gibi görünüyor
- 5. tarafından Sipariş Gibi: LIKE önce unLIKE döndürüyor?
- 6. İndekslemek için "sütuna" sipariş vermem gerekir mi?
- 7. Sıralama sözlüğü
- 8. JAXB Basitleştirilmiş eklenti hala kullanılabilir mi?
- 9. MongoDB BSON belgesinde anahtar sipariş önemlidir mi?
- 10. "Grup by" sayım sonucu "Sipariş" ile mi?
- 11. C# sözlüğü başlatıcısı derleme tutarsızlık
- 12. Nasıl böyle sözlüğü Sözlük
- 13. Python'da 2B sözlüğü oluşturma
- 14. Sipariş
- 15. arama tablosundan sözlüğü oluşturmak
- 16. Python Listeler sözlüğü yaratılıyor
- 17. Perl CPAN sözlüğü
- 18. Dizgeleştirme NET sözlüğü
- 19. Statik kaynak sözlüğü oluşturma
- 20. Python sözlüğü tuple'a dönüştürür
- 21. BÜYÜK sözlüğü nasıl sıralanır
- 22. Python runtime hatası sözlüğü
- 23. Düzenleme Bir .ppam dosyası ile başka eklenti Excel için .xslm dosyası gibi bir eklenti powerpoint için
- 24. WPF Docking krom gibi mi?
- 25. Python grafiği windirstat gibi mi?
- 26. WordPress - eklenti ile eklenti oluşturma
- 27. jQuery Seçilmiş eklenti Ajax kullanarak seçenekleri dinamik olarak ekleyiniz mi?
- 28. Sipariş üzerine COUNT değer Sipariş
- 29. Sql Server GROUP'da tarihe göre sipariş nasıl biçimlendirilir? aşağıdaki gibi
- 30. R - emir ben gibi bir data.frame sipariş edebilirsiniz anlıyoruz KARAKTER
harika görünüyor! 'UpdateValue' yönteminizin bir hatası vardır — bir kullanıcı bunu yeni bir anahtarla çağırırsa,' _keys' güncellenmez. –
@NateCook, bunu fark ettiğiniz için teşekkürler. –
Upvoted, ama düzenli 'Sözlük' sözdizimi ile ideal olarak değiştirilebilen ve 'Sözlük' yani 'Sözlük' (örneğin 'Alamofire' gibi 'Parametre' enum ' –