使用空项目在Swift Ascending中对数组进行排序

时间:2014-10-25 20:21:27

标签: arrays xcode sorting swift alphabetical

在Xcode(Swift)中,我有一个初始化为100个空项的数组:

var persons = [String](count:100, repeatedValue: "")

使用某些函数,我将内容添加到数组中的位置,从0开始。

所以例如我的数组在某个特定时刻:

["Bert", "Daniel", "Claire", "Aaron", "", "", ... ""]

用点表示其余的空项目。我使用此函数按字母顺序对数组进行排序:

persons = persons.sorted {$0.localizedCaseInsensitiveCompare($1) == NSComparisonResult.OrderedAscending }

这给了我一个像这样的数组:

["", "", ... , "Aaron", "Bert", "Claire", "Daniel"]

我想要的是按字母顺序对数组进行排序,而不是使用前面的空项目。我需要得到一个数组:

["Aaron", "Bert", "Claire", "Daniel", "", "", ... , ""]

就我而言,我不想要一个带有空项目的数组,但是我发现如果我没有声明像100个项目那么我就无法为我的数组添加一个值(数组不会被填充到100个项目,这是肯定的。)

任何人都可以帮助我吗?

3 个答案:

答案 0 :(得分:6)

正如@Antonio所说,看起来你需要一个降序 set 的字符串。除了@ Antonio的答案中的Dictionary方法(效果很好),你也可以使用NSMutableSet(来自Objective-C的桥接):

let personSet = NSMutableSet()
personSet.addObject("Aaron")
personSet.addObject("Daniel")
personSet.addObject("Claire")
personSet.addObject("Aaron")
personSet.addObject("Bert")
personSet.addObject("Bert")
personSet.addObject("Joe")
personSet.removeObject("Joe") // You can remove too of course

创建集合:

{(
    Claire,
    Aaron,
    Daniel,
    Bert
)}

然后,当您希望人们成为Array时,您可以使用allObjects强制转换为[String]

personSet.allObjects as [String]

你可以像你现在一样对它进行排序:

let people = (personSet.allObjects as [String]).sort {$0.localizedCaseInsensitiveCompare($1) == NSComparisonResult.OrderedAscending }

这使得people

[Aaron, Bert, Claire, Daniel]

对于那些想知道如何对问题中最初陈述的Array进行排序(升序但最后用空字符串)的人,可以使用sort函数中的一些自定义逻辑来完成:

var persons = ["Bert", "Daniel", "Claire", "Aaron", "", "", ""]
persons.sort { (a, b) -> Bool in
    if a.isEmpty {
        return false
    } else if b.isEmpty {
        return true
    } else {
        return a.localizedCaseInsensitiveCompare(b) == .OrderedAscending
    }
}

结果:

["Aaron", "Bert", "Claire", "Daniel", "", "", ""]

答案 1 :(得分:2)

在您的问题和其他答案中阅读评论,我意识到您需要一个包含唯一值的有序集。在swift中没有内置的数据结构,但是可以通过使用字典轻松完成:只需使用字符串值作为字典键,使用布尔值作为字典值 - 这可以确保键是唯一的:

var persons = [String : Bool]()

persons["Bert"] = true
persons["Daniel"] = true
persons["Clair"] = true
persons["Clair"] = true
persons["Aaron"] = true
persons["Daniel"] = true
persons["Clair"] = true

您可以使用上面的代码快速验证字典是否仅包含4个元素。

接下来,获取字典键的副本(作为数组):

var values = persons.keys.array

并对其进行排序:

values.sort { $0.localizedCaseInsensitiveCompare($1) == NSComparisonResult.OrderedAscending }

或者,如果您想坚持使用固定大小的数组,则可以在排序前删除空项:

persons = persons
            .filter( { $0.isEmpty == false } )
            .sorted {$0.localizedCaseInsensitiveCompare($1) == NSComparisonResult.OrderedAscending }

答案 2 :(得分:2)

我认为你对数组感到困惑。 Swift数组不是静态分配的结构,必须分配并填充到最大设计容量。下面是一个粗略的例子,说明如何完成你在这里表达的大部分内容。但是,我真的认为字典更适合您的需求。

var persons = [String]()
var inputData = ["Bert", "Daniel", "Bert", "Claire", "Aaron"]
for item in inputData {
    var found = false
    for existing in persons {
        if existing == item {
            found = true
            break
        }
    }
    if (!found) {
         persons.append(item)
    }
}
persons.sort{$0.localizedCaseInsensitiveCompare($1) == NSComparisonResult.OrderedAscending }
println(persons)