2017-07-04 84 views
0

我目前有很多用户的tableview,但我想按特定的顺序对用户进行排序,而不仅仅是升序或降序。比方说,我有一个数组与下列用户。Swift - 对数组的一个子集进行排序

"User1", "1st grade" 
"User2", "1st grade" 
"User3", "kids" 
"User4", "6th grade" 
"User5", "5th grade" 
"User6", "2nd grade" 
"User7", "kids" 
"User8", "juniors" 

如何订购我的阵列,使所有谁是孩子班上的学生将被显示在第一,其次是所有类用数字(按顺序),然​​后所有的青年。

我想,可以显示该

"User3", "kids" 
"User7", "kids" 
"User1", "1st grade" 
"User2", "1st grade" 
"User6", "2nd grade" 
"User5", "5th grade" 
"User4", "6th grade" 
"User8", "juniors" 

编辑数组: 更新文本明确指出,数组有两列,而不仅仅是一个字符串。

之所以能够通过使用线来实现它下面

let sortedArray = 
self.userArray.sorted(by: { $0.SchoolGrade!.gradeLongName().contains("Kids") || 
$1.SchoolGrade!.gradeLongName().contains("Juniors") }) 
+0

什么是你的对象的结构?如果它是'[[String]]'你可能想要改变你的数据模型。其他https://stackoverflow.com/questions/34957771/sort-a-array-according-to-another-array-swift?并定义“年龄/阶级”的逻辑,因为只是字符串,它不是。 – Larme

+0

我使用下面的答案修复了它。我的结构包含与数据库相同的东西:主要是整数,包括第二列(等级)的整数。我确实可以使用等级的int而不是等级文本本身对数组进行排序,所以我会研究它。谢谢! –

回答

2

Swift有一个排序算法,可以让你使用闭包进行排序。如果第一个参数在第二个参数之前出现,闭包应该返回true。

let sortedArray = user.sorted(by: { 

    ($0.gradeLongName().contains("kids") 
    || $1.gradeLongName()contains("juniors") 
    || $0.gradeLongName() < $1.gradeLongName()) 
    && !($0.gradeLongName().contains("kids") && $1.gradeLongName().contains("kids")) 
    && !($0.gradeLongName().contains("juniors") && $1.gradeLongName().contains("juniors")) 
}) 

应该这样做。封闭说,如果第一个孩子在里面有两个孩子,第二个里面有三个孩子,或者他们按照正确的顺序排列,这两个元素的顺序是正确的。最后两个子表达式使关闭返回false当两个元素都有小孩或双方有晚辈这对API的要求

您还可以使用尾随在这里封闭语法:

let sortedArray = user.sorted{ ($0.gradeLongName().contains("kids") 
    || $1.gradeLongName()contains("juniors") 
    || $0.gradeLongName() < $1.gradeLongName()) 
    && !($0.gradeLongName().contains("kids") && $1.gradeLongName().contains("kids") 
    && !(($0.gradeLongName().contains("juniors") && $1.gradeLongName().contains("juniors")) } 

你也可以做一个到位的排序与sort(by:)

API文档一个可变的阵列上的位置:https://developer.apple.com/documentation/swift/array/2296815-sorted

+0

非常感谢!太棒了。修正了我的数组排序如下。非常短和干净;-) 'let sortedArray = self.userArray.sorted(by:{$ 0.SchoolGrade!.gradeLongName()。contains(“Kids”)|| $ 1.SchoolGrade!.gradeLongName()。contains(“ (0)分享到开心网分享到新浪微博分享到搜狐微博分享到腾讯微博分享到开心网分享到人人网分享到豆瓣网阅读()分享到人人分享到QQ空间分享到朋友社区分享到新浪微博分享到搜狐微博分享到腾讯微博分享到开心网分享到人人网分享到豆瓣网阅读 –

+0

等等,逗号检查根本就没有必要,因为数组包含两个单独的元素,而不是一个带逗号的字符串。以下就足够了:D'let sortedArray = self.userArray.sorted(by:{$ 0.SchoolGrade!.gradeLongName()。contains(“Kids”)|| $ 1.SchoolGrade!.gradeLongName()。contains(“Juniors” )' –

0

您应该创建三个单独的阵列,用filter能得到相应的结果,然后将它们逐一排序。之后,你应该通过一个简单的附加操作来加入这三个数组。

+0

我想你已经忘记了成绩单的棘手类别? – brianLikeApple

0

你正在尝试排序的东西不是普通的排序程序。所以首先检查你的数据结构以获得更好的分类解决方案

但是,如果你坚持使用字符串列表进行排序,那么你可以尝试下面的代码(非常难看),它可以在操场上运行:

import UIKit 

var array = [String]() 
array.append("User1, 1st grade") 
array.append("User2, 1st grade") 
array.append("User3, kids") 
array.append("User4, 6th grade") 
array.append("User5, 5th grade") 
array.append("User6, 2nd grade") 
array.append("User7, kids") 
array.append("User8, Juniors") 

let kidsArray = array.filter { $0.lowercased().contains("kids") }.sorted() 
let gradeArray = array.filter { $0.lowercased().contains("grade") }.sorted { $0.components(separatedBy: ",").last! < $1.components(separatedBy: ",").last! } 
let juniorArray = array.filter { $0.lowercased().contains("juniors") }.sorted() 

var finalArray = [String]() 
finalArray.append(contentsOf: kidsArray) 
finalArray.append(contentsOf: gradeArray) 
finalArray.append(contentsOf: juniorArray) 

print(finalArray) 

打印:

[ “用户3,孩子”,“用户7,孩子”,“用户1,1级”,“用户2,1级”,“用户6,2级”,“用户5,5级”,“用户4,6级”,“ Juniors“]

+0

非常感谢您的支持,但是我的数组并没有包含一个长串。我的模型很好,我只需要比较两个元素并定位它们。 –

相关问题