2017-07-04 82 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

非常感謝您的支持,但是我的數組並沒有包含一個長串。我的模型很好,我只需要比較兩個元素並定位它們。 –

相關問題