2017-11-02 1 views
0

현재 공연 양방향지도가 필요합니다. Swift에서 사전은 되돌릴 수 있지만 대응되는 사전이 아닌 해당 유형의 튜플을 반환합니다.Swift에서 양방향지도를 구현하는 방법은 무엇입니까?

라이브러리가 있습니까? 아니면이 문제를 해결하는 방법에 대한 아이디어가 있습니까? 쉽게 일반적인 구조체를 사용하여 자신 만 만들 수 스위프트 4를

감사

+1

bimap에 대한 내장 DS 없습니다. 그러나 너는 너 자신을 만들 수있다. [This] (https://github.com/mauriciosantos/Buckets-Swift/blob/master/Source/Bimap.swift)는 아이디어를 줄 수 있습니다. [this] (https://github.com/pohl/Swava/blob/master/Swava/BiMap.swift)도보실 수 있습니다. –

+0

@PuneetSharma 솔직히 말해서, 나는 그와 비슷한 것을 생각해 냈습니다.하지만 실제로 성능이 향상되지는 않았습니까? –

+1

어쨌든지도가 꽤 빠르기 때문에 요소 검색이나 저장 요소의 시간 복잡성에는 큰 차이가 없어야합니다. 유일한 관심사는 순방향/역방향 맵 저장에 추가 공간을 사용하는 것입니다. 그러나, 나는 그것이 어떻게 피할 수 있는지 보지 않는다. –

답변

1

:

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" 
관련 문제