2017-11-02 18 views
0

Ich benötige derzeit eine performante bidirektionale Karte. In Swift kann jedoch ein Wörterbuch umgekehrt werden, das ein Tupel der Typen zurückgibt, aus denen es besteht, nicht ein Gegenwörterbuch.Wie würde man in Swift eine bidirektionale Karte implementieren?

Gibt es eine Bibliothek für das, oder jemand hat Ideen, wie dieses Problem zu lösen?

Dank

+1

Es gibt keine in-built DS für bimap. Aber Sie können selbst eine bauen. [This] (https://github.com/mauriciosantos/Buckets-Swift/blob/master/Source/Bimap.swift) kann Ihnen eine Idee geben. Sie können sich auch [this] (https://github.com/pohl/Swava/blob/master/Swava/BiMap.swift) ansehen. –

+0

@PuneetSharma Um ehrlich zu sein, habe ich an so etwas gedacht, aber es ist nicht wirklich ein Leistungsschub, oder? –

+1

Es sollte keinen großen Unterschied in der zeitlichen Komplexität des Elements Retrieval oder Speichern von Elementen geben, da Maps sowieso ziemlich schnell sind. Die einzige Sorge ist die Verwendung von zusätzlichem Speicherplatz zum Speichern von Vorwärts/Rückwärts-Karten. Aber ich sehe nicht, wie das vermieden werden kann. –

Antwort

1

Mit Swift 4 Sie ganz einfach Ihre eigene Verwendung eines generischen Struktur machen könnte:

struct BidiMap<F:Hashable,T:Hashable> 
{ 
    var forward:[F:T] = [:] 
    { 
     didSet 
     { 
     if forward != oldValue 
     { back = [T:F](uniqueKeysWithValues:forward.map{($1,$0)}) } 
     } 
    } 

    var back:[T:F] = [:] 
    { 
     didSet 
     { 
     if back != oldValue 
     { forward = [F:T](uniqueKeysWithValues:back.map{($1,$0)}) } 
     } 
    } 

    init(_ baseDict:[F:T] = [:]) 
    { 
    forward = baseDict 
    back = [T:F](uniqueKeysWithValues:baseDict.map{($1,$0)}) 
    } 

    init(_ baseValues:[(F,T)]) 
    { forward = [F:T](uniqueKeysWithValues:baseValues) } 

    subscript(_ key:F) -> T? 
    {get { return forward[key] } set{ forward[key] = newValue } } 
} 

var bd = BidiMap([1:"A", 2:"B", 3:"C"]) 
bd[1] // "A" 
bd.back["B"] // 2 
bd[4] = "D" 
bd.back["D"] // "4" 
Verwandte Themen