反向Swift字典查找

5

我有一个像这样的字典:

let ints: [Int: String] = [
    0: "0",
    1: "1",
    2: "2",
    3: "3",
    4: "4",
    5: "5",
    6: "6",
    7: "7",
    8: "8",
    9: "9",
    10: "A",
    11: "B",
    // etc...
]

我可以使用ints[5]来查找整数并获取"5"。如何从字符串中查找整数?我想做类似于ints.keys["5"]的操作,得到的结果是5

目前,我只是把字典反过来写了:

let chars: [String: Int] = [
    "0": 0,
    "1": 1,
    "2": 2,
    "3": 3,
    "4": 4,
    "5": 5,
    "6": 6,
    "7": 7,
    "8": 8,
    "9": 9,
    "A": 10,
    "B": 11,
    // etc...
]

我可以使用chars["5"]来获取5,但是因为我的字典很大,如果需要轻松更改字典,这种方法就很麻烦。

澄清

我不想以编程方式构建字典,而是只想保留一个硬编码的字典。


有必要手写它们吗?映射看起来非常基础。 - luk2302
我写下了基础知识,以便更容易地解释问题。 - twharmon
你把它做得太基础了。这个映射是否可逆?它总是1:1吗? - luk2302
3
可能是Swift字典获取值对应的键重复的问题。- 但如果您需要对同一个字典进行多次查找,则建议创建一个反向映射的字典。 - Martin R
4个回答

6
您可以利用 Swift 字典实现了 Collection 协议的特点,该协议扩展了 Sequence 协议,并使用 first 方法来返回符合给定条件的序列的第一个元素:
extension Dictionary where Value: Equatable {
    func key(forValue value: Value) -> Key? {
        return first { $0.1 == value }?.0
    }
}

ints.key(forValue: "5")    // 5
ints.key(forValue: "99")   // nil

以上代码的作用类似于将Dictionary转换为(Key, Value)对序列。唯一的注意事项是如果存在多个键匹配到同一个值,我们只得到其中一个键,而且无法确定是哪一个键 —— 尽管如果你的字典具有一对一映射,那么就不会有这个问题。

1

我使用了Martin R的链接找到了这个解决方案:

let int = 11
print(chars.filter{$1 == int}.map{$0.0}[0]) // B

1
如果你知道字典(chars)中值到键的映射是双射(one to one),你可以使用first而不是filter: 前者允许在第一个命中时提前退出(短路处理),而filter将传递完整的无序字典。例如,print(chars.first(where: { $1 == int })?.0 ?? "No such value") - dfrib
是的,它是双射的。谢谢,这加快了事情进展的速度。 - twharmon

1
另一种方法是通过编程构建1:1反向查找:
    var chars = ["a":1,"b":2,"c":3]

    var ints = [Int:String]()
    for pair in chars { ints[pair.value] = pair.key }

ints 包含:

    [1:"a", 2:"b", 3:"c"]

如果您需要多次使用它,那么它可以很有效。


0

像 @dfri 提到的那样,您可以使用 first 方法来获取给定值的第一个键:

extension Dictionary where Value: Equatable {

    func key(for value: Value) -> Key? {
        return first(where: { $1 == value })?.key
    }


}

我已经将我的解决方案添加到了重复目标中。请注意,这并不是获取“第一个”键,因为字典是无序集合(因此,“第一个”在这里语义上没有意义)。然而,它确实获取了_某个_键,可能是具有提供的值的单个键,或者只是我们在无序集合中首先遇到的许多键之一。 - dfrib

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接