【问题标题】:How to return one single string from matching dictionary values?如何从匹配的字典值中返回一个字符串?
【发布时间】:2019-08-30 11:10:01
【问题描述】:

我正在尝试从字典中返回一串选定的值。当我遍历字典和从中获取键的数组时,我可以打印出值,但作为不同的字符串,而不是组合。

到目前为止,我已经迭代了集合类型,并在一定程度上尝试了 map、filter、reduce。还尝试将结果放入数组和字典中以使用 .joined,但我总是得到 nil。

这是我从中获取值的字典:

let letterDict = ["a": "1", "b": "2", "c": "3", "d": "4"]

这是我要查询的数组:

let characterArray = ["a", "b"]

这是我能够从中获得结果的代码:

func convertText(_ input: String) -> String {
    var expectedText: String?

    for character in characterArray {
        for (key, value) in letterDict {
            if key.contains(character) {
                print(value)
                expectedText = value
            }
        }
    }
    return expectedText ?? input
}

我正在尝试返回12,但我得到的是:

1
2

一直都是。即使我尝试将它们映射到数组,它也只会返回单独的数组(或字典)。当我尝试追加到一个数组时,它只返回 nil。

提前致谢。

【问题讨论】:

  • 实际上你从那个函数返回的是 2。甚至不是 1 2 这个结果是因为你打印了这些值。如果要在同一行中打印值,请使用; print(char, terminator: "")@Dávid Pásztor 给出的真实问题你已经有了正确答案

标签: swift dictionary


【解决方案1】:

您需要将value 附加到expectedText 而不是分配它。

func convertText(_ input: String) -> String {
    var expectedText = ""

    for character in characterArray {
        for (key, value) in letterDict {
            if key.contains(character) {
                expectedText += value
            }
        }
    }
    return expectedText.isEmpty ? input : expectedText
}

【讨论】:

  • 最好以expectedText 开头为""(非可选),然后您可以使用expectedText += value
  • @Alexander 可以,但返回结果变为return expectedText == "" ? input : expectedText。但你是对的,使用单个三元运算符比在嵌套循环的每次迭代中使用默认值更好
  • @DávidPásztor 更好的是,使用expectedText.isEmpty,但是是的,我会说这要好得多。 Nitpick:这就是 条件运算符。它是一个三元运算符(因为它是一个接受 3 个操作数的运算符),它恰好是目前 Swift 中唯一的三元运算符,但没有人说可能永远不会有另一个。
  • @Alexander 我总是忘记条件运算符的正确名称,谢谢提醒:)
【解决方案2】:

这是另一种使用compactMap[Character : Character] 字典的方法:

let letterDict: [Character : Character] = ["a": "1", "b": "2", "c": "3", "d": "4"]

let str = "ab"
var newstr = String(str.compactMap { letterDict[$0] })
print(newstr) // 12

如果没有匹配的字符,这将返回空字符串"",而您的代码返回原始字符串。如果这是您想要的结果,您可以按照以下方式进行操作:

newstr = newstr.isEmpty ? str : newstr

所以你的函数变成了:

func convertText(_ input: String) -> String {
    let expectedText = String(input.compactMap { letterDict[$0] })
    return expectedText.isEmpty ? input : expectedText
}

print(convertText("ab")) // 12
print(convertText("ef")) // ef

【讨论】:

  • 即使字典必须是[Character: String],也很简单str.compactMap { letterDict[$0] }.joined(separator: "")
  • 这是真的@Alexander,虽然.joined() 就足够了。
  • 有趣的是,我不知道separator 有一个默认值:o
猜你喜欢
  • 2020-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-20
  • 1970-01-01
  • 2017-03-22
相关资源
最近更新 更多