Arrays 以带空项的快速升序排序数组

Arrays 以带空项的快速升序排序数组,arrays,xcode,sorting,swift,alphabetical,Arrays,Xcode,Sorting,Swift,Alphabetical,在Xcode(Swift)中,我有一个初始化为100个空项的数组: var persons = [String](count:100, repeatedValue: "") 通过一些函数,我从0开始向数组中的位置添加内容 例如,我的数组在某个给定时刻: ["Bert", "Daniel", "Claire", "Aaron", "", "", ... ""] 点代表其余的空项。我使用此函数按字母顺序对数组排序: persons = persons.sorted {$0.localizedCa

在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项)


有人能帮我吗?

阅读您的问题和其他答案中的注释,我意识到您需要一个包含唯一值的有序集。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个元素

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

并对其进行排序:

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

或者,如果要使用固定大小的数组,可以在排序之前删除空项:

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

正如@Antonio所说,看起来您需要一组降序字符串。除了@Antonio的答案中的
Dictionary
方法(非常有效),您还可以使用
NSMutableSet
(从Objective-C桥接而来):

这将创建集合:

{(
    Claire,
    Aaron,
    Daniel,
    Bert
)}
然后,当您希望人员作为
数组时,可以使用
allObjects
转换为
[String]

personSet.allObjects as [String]
您可以像当前一样对其进行排序:

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

[Aaron, Bert, Claire, Daniel]

对于那些想知道如何按照问题中最初所述对
数组
进行排序的人(升序,但结尾是空字符串),可以通过排序函数中的一点自定义逻辑来完成:

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", "", "", ""]

我认为你对数组感到困惑。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)

不确定您所说的“如果我没有像100个条目那样声明,我发现我无法向数组添加值”是什么意思。您的意思是不能将项附加到数组中吗?代码按降序对元素进行排序(如标题中所述)。这将把空字符串排在最后。您的示例输出与代码不匹配。@Antonio否,我想要的是一个可以向其中添加值和从中删除值的数组。理想情况下,该数组将只包含值,而不包含空项,因此它在任何时候都只包含所需的长度。如果需要添加值,则需要在数组中添加一个新项。我只是选择了给它100个值为“”的项目,这样我就总是有空间来放置一个新值。你知道我的意思吗?@MartinR是的,你是对的。对不起,我抄错了部分。我已经更新了我的原始帖子。我需要从我的数组中添加和删除项目。用户输入一个接一个的名称,它们需要存储在一个数组中,然后该数组需要排序,数组的内容显示在UITextView中。我想使用一个没有空格的数组,但仍然能够完全操纵数组。您可以通过将一个键的值设置为
nil
,从字典中删除一个项,例如
persons[“Clair”]=nil
是,但我仍然需要向数据库中添加新的人。如果您想在swift中高效地开发,我建议你多了解一些。顺便说一句,我已经更新了我的答案look@Bastiaan
persons[“Pete”]=true
将其添加到
词典
persons[“Pete”]=nil
将其从
词典
中删除。使用这些方法,您可以添加和删除任何需要的项目。谢谢。最后一部分是对数组进行升序排序,最后是空项,解决了我的问题,这就是为什么我选择这个作为解决方案。感谢大家(特别是@Antonio)提供的其他选项和文档@巴斯蒂安,不客气。但是,根据您的需要,我强烈建议您使用@Antonio的
字典
方法或
NSMutableSet
而不是使用空字符串预先填充
数组
;这会更有效率。我理解,我肯定会研究并尝试将我的程序转换为使用Antonio或您的NSMutableSet建议之类的字典
["Aaron", "Bert", "Claire", "Daniel", "", "", ""]
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)