Swift 2 - 使用从A到Z的键将数组分离到字典中

问题描述 投票:3回答:5

我有一个数组,例如["Apple", "Banana", "Blueberry", "Eggplant"],我想将其转换为如下字典:

[
    "A" : ["Apple"],
    "B" : ["Banana", "Blueberry"],
    "C" : [],
    "D" : [],
    "E" : ["Eggplant"]
]

我在Xcode 7 beta 4上使用Swift 2.谢谢!

ios arrays swift dictionary
5个回答
7
投票

仅使用Swift 2对象和方法,并使用字母表中每个字母的键:

let alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".characters.map({ String($0) })

let words = ["Apple", "Banana", "Blueberry", "Eggplant"]

var result = [String:[String]]()

for letter in alphabet {
    result[letter] = []
    let matches = words.filter({ $0.hasPrefix(letter) })
    if !matches.isEmpty {
        for word in matches {
            result[letter]?.append(word)
        }
    }
}

print(result)

4
投票

我在Xcode playground中编写了这个:

import Foundation

var myArray = ["Apple", "Banana", "Blueberry", "Eggplant"]

var myDictionary : NSMutableDictionary = NSMutableDictionary()

for eachString in myArray as [NSString] {

    let firstCharacter = eachString.substringToIndex(1)

    var arrayForCharacter = myDictionary.objectForKey(firstCharacter) as? NSMutableArray

    if arrayForCharacter == nil
    {
        arrayForCharacter = NSMutableArray()
        myDictionary.setObject(arrayForCharacter!, forKey: firstCharacter)
    }

    arrayForCharacter!.addObject(eachString)
}

for eachCharacter in myDictionary.allKeys
{
    var arrayForCharacter = myDictionary.objectForKey(eachCharacter) as! NSArray

    print("for character \(eachCharacter) the array is \(arrayForCharacter)")
}

3
投票

我发现这个问题帮助我更好地理解了我一直在思考的一些概念。这是基于可接受的正确答案的替代方案,该答案稍微简洁并且以编程方式生成字母表。这是Xcode 7中的Swift 2。

let words = ["Apple", "Banana", "Blueberry", "Eggplant"]
let alphabet = (0..<26).map {n in String(UnicodeScalar("A".unicodeScalars["A".unicodeScalars.startIndex].value + n))}
var results = [String:[String]]()
for letter in alphabet {
    results[letter] = words.filter({$0.hasPrefix(letter)})
}

print(results)

我相信但不确定let alphabet线可以更简洁。


2
投票

这是我的解决方案。适用于纯Swift 2和O(n)时间,其中n是单词列表的长度(假设字典是作为哈希表实现的)。

var dictionary: [String : [String]] = [ "A" : [], "B" : [], "C" : [], "D" : [],
"E" : [], "F" : [] /* etc */ ]

let words = ["Apple", "Banana", "Blueberry", "Eggplant"]

for word in words
{
    let firstLetter = String(word[word.startIndex]).uppercaseString

    if let list = dictionary[firstLetter]
    {
        dictionary[firstLetter] = list + [word]
    }
    else
    {
         print("I'm sorry I can't do that Dave, with \(word)")
    }
}

print("\(dictionary)")

0
投票

我刚刚制作了这样有用的数组扩展,它可以根据对象的选定属性将对象数组映射到字符索引对象字典。

    extension Array {

    func toIndexedDictionary(by selector: (Element) -> String) -> [Character : [Element]] {

        var dictionary: [Character : [Element]] = [:]

        for element in self {
            let selector = selector(element)
            guard let firstCharacter = selector.firstCharacter else { continue }

            if let list = dictionary[firstCharacter] {
                dictionary[firstCharacter] = list + [element]
            } else {
                // create list for new character
                dictionary[firstCharacter] = [element]
            }
        }
        return dictionary
    }
}

extension String {
    var firstCharacter : Character? {
        if count > 0 {
            return self[startIndex]
        }
        return nil
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.