2017-07-04 5 views
0

現在、私は多くのユーザーでテーブルビューを持っていますが、昇順または降順だけでなく、特定の順序でユーザーを並べ替えたいと思います。次のユーザーがいる配列があるとします。子供のクラスにあるすべての学生は、すべての数字を持つクラス(順番に)、すべてのジュニアに続いて、表示すべき最初のものであるように。私は私の配列を注文することができますどのように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" 

編集を表示することができ、配列をしたい: アレイが2列だけではなく、1つの文字列を持っていることを明確にするテキストを更新しました。

は、あなたがそれらを個別に並べ替えた後、適切な結果を得るためにfilterを使用して、3つの別々の配列を作成する必要があり

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?文字列だけではないため、 "age/class"ロジックを定義します。 – Larme

+0

私は以下の答えを使ってそれを修正しました。私の構造体にはデータベースと同じものが含まれています。大部分はintで、2番目の列(等級)のintを含みます。グレードのテキスト自体ではなく、グレードのintを使って配列を並べ替えることができるので、私はそれを調べます。ありがとう! –

答えて

2

Swiftにはソートアルゴリズムがあり、クロージャを使ってソートすることができます。最初の引数が2番目の引数の前に来る場合、クロージャは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")) 
}) 

このトリックを行う必要があります。クロージャーは、最初のものに子供が入っていれば2つの要素が正しい順序にあり、2番目の要素はそれに後輩があるか、アルファベット順に正しい順序であると言います。

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")) } 

また、あなたが行うことができます:二つの要素が子供を持っているか、両方のあなたがここにも閉鎖構文を末尾に使用することができるAPI

ための要件である後輩を持って、両方の時に最後の二つの部分式は閉鎖がfalseを返すように可変配列上の場所の一種でsort(by:)

APIのドキュメントはここにあると:https://developer.apple.com/documentation/swift/array/2296815-sorted

+0

ありがとうございました!これは完璧です。私のバージョンの配列ソートを次のように修正しました。非常に短くてきれいな;-) 'let $ sortedArray = self.userArray.sorted($ 0.SchoolGrade!.gradeLongName()。contains(" Kids ")|| $ 1.SchoolGrade!.gradeLongName()。contains(" $$SchoolGrade!.gradeLongName()。コンポーネント(separatedBy: "、")。最後! }) '$ .SchoolGrade!.gradeLongName()。コンポーネント(separatedBy:"、 ") –

+0

配列に2つの別々の要素が含まれていて、コンマを含む1つの文字列ではないため、コンマチェックはまったく必要ありませんでした。次のようにすれば十分でした:D。sortedArray = self.userArray.sorted($ 0.SchoolGrade!.gradeLongName()。contains( "Kids")|| $ 1.SchoolGrade!.gradeLongName()。contains( "Juniors" ) ' –

0

以下の行を使用して、それを達成することができました。その後、簡単な追加操作で3つの配列を結合する必要があります。

+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) 

は、Print::遊び場上で実行することができ

しかし、あなたはソートするあなたの文字列のリストを使用して主張している場合は、次のコードを試すことができます(非常に醜い

[ 「User3、Kids」、「User7、Kids」、「User1、1st grade」、「User2、1st grade」、「User6、2nd grade」、「User5,5」、「User4,6th grade」、「User8」、 Junior "]

+0

ヘッドアップありがとう、ありがとう、私の配列には1つの長い文字列が含まれていませんでした。私のモデルは大丈夫だった、私はちょうど2つの要素を比較し、それらを配置する必要があった。 –

関連する問題