【问题标题】:Swift code: how do you build a Dictionary of Array of String based on Dictionary entry being nilSwift 代码:如何根据字典条目为 nil 构建字符串数组字典
【发布时间】:2014-08-15 13:33:06
【问题描述】:

我一直在尝试了解如何使用 Swift 使用 Dictionary 和 Array 类型做一些简单的事情。

我首先尝试编写下面的简单函数来操作字符串列表并将它们存储到同一个数组中,当字符串是彼此的字谜时......!

这里的所有东西都应该在 Xcode 的 Playground 中运行。

问题:

  1. 为什么不能使用 toString() 将字符数组转换为字符串。我必须遍历字符数组并使用 += 构建字符串?
  2. 即时将数组添加到字典的最佳方法是什么,因为我发现字典对于该字符串索引是空的,因此我需要创建一个新数组来保存包含相同字母的字符串。关于 Dictionary 不包含您认为的类型但实际上包含 Type 的困惑? (即选项类型 - 在我的情况下为字符串?,可选字符串)。

请看下面的疯狂代码。

groupAnagrams(
  listofWords: pass an array of String (immutable)
 )

返回 字符串数组字典(分组字谜) 在字符串数组中执行的操作数的摘要 在字符串数组中执行的操作日志

目的 将作为字谜的单词分组到桶中 func 将创建一个以字符串为索引的字典,该字符串是字符的顺序字符串,例如 ["bats", "stab"] => ["abst" : ["rats", "stab"] ]

函数 charArrayToString

func charArrayToString(charArray ca: [Character]) -> String {
    var s = ""
    for c in ca {
        s += String(c)
    }
    return s
}

func groupAnagrams(#listOfWords: [String]) -> [String:[String]] {
    var s = ""
    var d: [String:[String]] = [String:[String]]()
    var i = 0, j = 0, k = 0
    var log = [String]()

    for s in listOfWords {
        var s1:[Character] = [Character](s)
        //    var s1 = s
        sort(&s1) { (a: Character, b: Character) -> Bool in return String(a) < String(b) }
//???        var s2 = toString(s1) // converts the Array of Character to a string (but it's for the for "[a,b,c,d]" and not "abcd" as you'd expect!
        var s3 = charArrayToString(charArray: s1)
        // Array already exists, add a string ELSE create the String array [String]() and add the fisst element
        if let p = d[s3] {
            // Array exists but d[s3] is "immutable" as it's optional array of String (type [String]?)
            ++i
            var arr = d[s3]!
            arr += [s]
            d[s3] = arr
            log += "Add string \(arr.count) \(s) to array \(s3) \n"
        } else {
            // ELSE: Create new String array
            ++j
            d[s3] = [String]()
            var arr = d[s3]!
            arr += [s]
            d[s3] = arr
            log += "Create array for \(s3) with string \(s) \n"
        }
        ++k
        //    break
    }


    var summary = [String]()
    summary += ["\(i) strings added to already created arrays"]
    summary += ["\(j) arrays created"]
    summary += ["\(k) words processed"]

    summary[0] // inspect
    summary[1] // inspect
    summary[2] // inspect

    log // inspect

    return d
}

// 与函数的数组版本相同,只是将字符串添加到函数的参数列表中

func groupAnagramsList(strings: String...) -> [String:[String]] {
    return groupAnagrams(listOfWords: strings)
}

调用创建的各种函数:

var listOfWords = [String]() + ["bats", "star", "tree", "stab", "rats", "reet", "pong", "peel", "leep", "path", "type", "pyte", "ypte"]

var anagrams = groupAnagrams(listOfWords: listOfWords)

var otherWay = groupAnagramsList("bats", "star", "tree", "stab", "rats", "reet", "pong", "peel", "leep", "path", "type", "pyte", "ypte")

从 Swift Beta 5 更新:

if d[s3] == nil {
    d[s3] = [String]()
    ++j
} else {
    ++i
}
d[s3]! += [s]
log += ["Add string \(d[s3]!.count) \(s) to array \(s3) \n"]

字典 d 上的 nil 检查是有效的!在这种情况下,复杂的可选/不可变行为消失了,代码更容易理解。 注意:我不得不改变

log += "将字符串 (d[s3]!.count) (s) 添加到数组 (s3) \n"

收件人:

log += ["将字符串 (d[s3]!.count) (s) 添加到数组 (s3) \n"]

因为您现在需要将字符串数组显式添加到字符串数组。您不能假设字符串上的 += 会将字符串附加到数组中。但这很简单,只需将字符串包裹在 '[' 和 ']' 中即可。

我仍然不知道为什么我不能将字符数组转换为字符串!

【问题讨论】:

    标签: arrays dictionary swift optional


    【解决方案1】:

    也许明智的做法是使用 Swift 的内置 Objective-C API 来消除重复值。例如:

    let unique = NSSet(array: swiftArrayOfNonUniqueStrings).allObjects
    

    问题是,将它应用于您的字符排序、包含重复项的字符串数组只会返回原始字符串的字符排序版本。 (下面返回alphaList可以得到这样的数组。)

    至于对字符串中的字符进行排序,我相信遍历字符来构建字符串是足够有效的。你可以写得更简洁一些

    func alphabetizeStrings(list : [String]) -> [String] {   
        var newlist = [String]()
        var alphaList = [String]()
        for s in list {
            var charArray = [Character](s)
            charArray.sort({ (a: Character, b: Character) -> Bool in return String(a) < String(b)})
            var sortedString = ""
            for c in charArray {
                sortedString += c
            }
            if NSArray(array: alphaList).containsObject(sortedString) == false {
                newlist.append(s)
            }
            alphaList.append(sortedString)
        }
        return newlist
    }
    

    因此:

    let swiftarray = ["foo", "foo", "bar", "bra", "bat"]
    let unique = alphabetizeStrings(swiftarray)
    // ["foo", "bar", "bat"]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-07
      • 2016-06-21
      • 2020-09-16
      • 1970-01-01
      • 1970-01-01
      • 2014-09-12
      • 2019-12-03
      • 1970-01-01
      相关资源
      最近更新 更多