web-dev-qa-db-ja.com

プロパティ値によるカスタムオブジェクトの配列の並べ替え方法

imageFileというカスタムクラスがあり、このクラスには2つのプロパティが含まれているとしましょう。

class imageFile  {
    var fileName = String()
    var fileID = Int()
}

それらの多くはArrayに格納されています

var images : Array = []

var aImage = imageFile()
aImage.fileName = "image1.png"
aImage.fileID = 101
images.append(aImage)

aImage = imageFile()
aImage.fileName = "image1.png"
aImage.fileID = 202
images.append(aImage)

質問は:私はどのように私は 'fileID' ASCまたはDESCで画像の配列を並べ替えることができますか?

435
mohacs

最初に、配列を型付き配列として宣言して、繰り返したときにメソッドを呼び出せるようにします。

var images : [imageFile] = []

それからあなたは単にすることができます:

スイフト2

images.sorted({ $0.fileID > $1.fileID })

スイフト3&4

images.sorted(by: { $0.fileID > $1.fileID })

上の例では desc sortの順序になっています

791
Alex Wayne

[ Swift 3用にsort(by :) ]で更新されました。これは末尾のクロージャを悪用したものです。

images.sorted { $0.fileID < $1.fileID }

aSCまたはDESCに応じて、それぞれ<または>を使用します。images配列 を変更したい場合は、以下を使用してください。

images.sort { $0.fileID < $1.fileID }

これを繰り返し実行して関数を定義したい場合は、1つの方法があります。

func sorterForFileIDASC(this:imageFile, that:imageFile) -> Bool {
  return this.fileID > that.fileID
}

そして次のように使います。

images.sort(by: sorterForFileIDASC)
197
GoZoner

ほぼ全員が how を直接与えます。その進化を見せてください。

あなたはArrayのインスタンスメソッドを使用することができます:

// general form of closure
images.sortInPlace({ (image1: imageFile, image2: imageFile) -> Bool in return image1.fileID > image2.fileID })

// types of closure's parameters and return value can be inferred by Swift, so they are omitted along with the return arrow (->)
images.sortInPlace({ image1, image2 in return image1.fileID > image2.fileID })

// Single-expression closures can implicitly return the result of their single expression by omitting the "return" keyword
images.sortInPlace({ image1, image2 in image1.fileID > image2.fileID })

// closure's argument list along with "in" keyword can be omitted, $0, $1, $2, and so on are used to refer the closure's first, second, third arguments and so on
images.sortInPlace({ $0.fileID > $1.fileID })

// the simplification of the closure is the same
images = images.sort({ (image1: imageFile, image2: imageFile) -> Bool in return image1.fileID > image2.fileID })
images = images.sort({ image1, image2 in return image1.fileID > image2.fileID })
images = images.sort({ image1, image2 in image1.fileID > image2.fileID })
images = images.sort({ $0.fileID > $1.fileID })

Sortの動作原理についての詳細な説明は、 ソート済み関数 を参照してください。

49
fujianjin6471

スイフト3

people = people.sorted(by: { $0.email > $1.email })
41
quemeful

Swift 5では、Arrayには sorted()sorted(by:) という2つのメソッドがあります。最初のメソッドsorted()には、次の宣言があります。

ソートされたコレクションの要素を返します。

func sorted() -> [Element]

2番目のメソッドsorted(by:)には、次の宣言があります。

与えられた述語を要素間の比較として使ってソートされた、コレクションの要素を返します。

func sorted(by areInIncreasingOrder: (Element, Element) throws -> Bool) rethrows -> [Element]

#1比較可能なオブジェクトの昇順で並べ替え

コレクション内の要素タイプがComparableプロトコルに準拠している場合は、要素を昇順でソートするためにsorted()を使用できます。次のPlaygroundコードは、sorted()の使い方を示しています。

class ImageFile: CustomStringConvertible, Comparable {

    let fileName: String
    let fileID: Int
    var description: String { return "ImageFile with ID: \(fileID)" }

    init(fileName: String, fileID: Int) {
        self.fileName = fileName
        self.fileID = fileID
    }

    static func ==(lhs: ImageFile, rhs: ImageFile) -> Bool {
        return lhs.fileID == rhs.fileID
    }

    static func <(lhs: ImageFile, rhs: ImageFile) -> Bool {
        return lhs.fileID < rhs.fileID
    }

}

let images = [
    ImageFile(fileName: "Car", fileID: 300),
    ImageFile(fileName: "Boat", fileID: 100),
    ImageFile(fileName: "Plane", fileID: 200)
]

let sortedImages = images.sorted()
print(sortedImages)

/*
 prints: [ImageFile with ID: 100, ImageFile with ID: 200, ImageFile with ID: 300]
 */

#2類似オブジェクトの降順で並べ替え

コレクション内の要素型がComparableプロトコルに準拠している場合は、要素を降順でソートするためにsorted(by:)を使用する必要があります。

class ImageFile: CustomStringConvertible, Comparable {

    let fileName: String
    let fileID: Int
    var description: String { return "ImageFile with ID: \(fileID)" }

    init(fileName: String, fileID: Int) {
        self.fileName = fileName
        self.fileID = fileID
    }

    static func ==(lhs: ImageFile, rhs: ImageFile) -> Bool {
        return lhs.fileID == rhs.fileID
    }

    static func <(lhs: ImageFile, rhs: ImageFile) -> Bool {
        return lhs.fileID < rhs.fileID
    }

}

let images = [
    ImageFile(fileName: "Car", fileID: 300),
    ImageFile(fileName: "Boat", fileID: 100),
    ImageFile(fileName: "Plane", fileID: 200)
]

let sortedImages = images.sorted(by: { (img0: ImageFile, img1: ImageFile) -> Bool in
    return img0 > img1
})
//let sortedImages = images.sorted(by: >) // also works
//let sortedImages = images.sorted { $0 > $1 } // also works
print(sortedImages)

/*
 prints: [ImageFile with ID: 300, ImageFile with ID: 200, ImageFile with ID: 100]
 */

#3。比較不可能なオブジェクトについては、昇順または降順で並べ替え

コレクション内の要素型がComparableプロトコルに準拠していない場合は、要素を昇順または降順に並べ替えるためにsorted(by:)を使用する必要があります。

class ImageFile: CustomStringConvertible {

    let fileName: String
    let fileID: Int
    var description: String { return "ImageFile with ID: \(fileID)" }

    init(fileName: String, fileID: Int) {
        self.fileName = fileName
        self.fileID = fileID
    }

}

let images = [
    ImageFile(fileName: "Car", fileID: 300),
    ImageFile(fileName: "Boat", fileID: 100),
    ImageFile(fileName: "Plane", fileID: 200)
]

let sortedImages = images.sorted(by: { (img0: ImageFile, img1: ImageFile) -> Bool in
    return img0.fileID < img1.fileID
})
//let sortedImages = images.sorted { $0.fileID < $1.fileID } // also works
print(sortedImages)

/*
 prints: [ImageFile with ID: 300, ImageFile with ID: 200, ImageFile with ID: 100]
 */

コレクションをその場でソートする必要がある場合は、Swiftにはsort()およびsort(by:)の対応物として sorted() および sorted(by:) という2つのメソッドも用意されています。

25
Imanou Petit

Swift 3.0では

images.sort(by: { (first: imageFile, second: imageFile) -> Bool in
    first. fileID < second. fileID
})
23
jaiswal Rajan

2つの選択肢

1)sortInPlaceを使って元の配列を並べる

self.assignments.sortInPlace({ $0.order < $1.order })
self.printAssignments(assignments)

2)順序付き配列を格納するための代替配列の使用

var assignmentsO = [Assignment] ()
assignmentsO = self.assignments.sort({ $0.order < $1.order })
self.printAssignments(assignmentsO)
17
Bernauer

次のようなこともできます

images = sorted(images) {$0.fileID > $1.fileID}

だからあなたの画像配列はソートされたものとして保存されます

16
Nicolas Grenié

スイフト2から4 /

元の答えは、いくつかのプロパティを使ってカスタムオブジェクトの配列をソートしようとしました。以下に、Swiftデータ構造を使用して同じ動作をするためのいくつかの便利な方法を示します。

些細なことで、ImageFileを少しだけ変更しました。それを念頭に置いて、私は 3 imageファイルで配列を作成します。メタデータはオプションの値であり、パラメータとしてnilを渡すことが期待されることに注意してください。

 struct ImageFile {
      var name: String
      var metadata: String?
      var size: Int
    }

    var images: [ImageFile] = [ImageFile(name: "HelloWorld", metadata: nil, size: 256), ImageFile(name: "Traveling Salesmen", metadata: "uh this is huge", size: 1024), ImageFile(name: "Slack", metadata: "what's in this stuff?", size: 2048) ]

ImageFileには、sizeという名前のプロパティがあります。次の例では、sizeなどのプロパティを使ったソート操作の使い方を説明します。

最小サイズから最大サイズ(<)

    let sizeSmallestSorted = images.sorted { (initial, next) -> Bool in
      return initial.size < next.size
    }

最大から最小(>)

    let sizeBiggestSorted = images.sorted { (initial, next) -> Bool in
      return initial.size > next.size
    }

次に、Stringプロパティ名を使ってソートします。同様に、sortを使って文字列を比較します。しかし、内側のブロックが比較結果を返すことに注意してください。この結果はソートを定義します。

A-Z(.orderedAscending)

    let nameAscendingSorted = images.sorted { (initial, next) -> Bool in
      return initial.name.compare(next.name) == .orderedAscending
    }

Z-A(.orderedDescending)

    let nameDescendingSorted = images.sorted { (initial, next) -> Bool in
      return initial.name.compare(next.name) == .orderedDescending
    }

次にソートするのが好きな方法です。多くの場合、オプションのプロパティがあります。今心配しないで、我々はnilを扱わなければならないことを除いて上記と同じ方法でソートするつもりです!生産中;

このコードを使用して、nilプロパティ値を持つ配列内のすべてのインスタンスを最後に強制します。次に、想定されたラップされていない値を使用してメタデータを並べ替えます。

    let metadataFirst = images.sorted { (initial, next) -> Bool in
      guard initial.metadata != nil else { return true }
      guard next.metadata != nil else { return true }
      return initial.metadata!.compare(next.metadata!) == .orderedAscending
    }

オプションのために二次的なソートをすることは可能です。例えば;画像をメタデータ付きでサイズ順に表示できます。

15
jnblanchard

Swift 4.0、4.1、4.2最初に、以下に示すように、imageFile()型の可変配列を作成しました。

var arr = [imageFile]()

ImageFile()型の可変オブジェクト画像を作成し、以下に示すようにプロパティに値を割り当てます。

   var image = imageFile()
   image.fileId = 14
   image.fileName = "A"

さて、このオブジェクトを配列arrに追加します

    arr.append(image)

さて、同じ可変オブジェクト、すなわちimageに異なるプロパティを割り当てます

   image = imageFile()
   image.fileId = 13
   image.fileName = "B"

さて、画像オブジェクトを配列arrに追加します

    arr.append(image)

今度は、 昇順 on fileId プロパティを配列arrオブジェクトに適用します。昇順に <記号 を使用

 arr = arr.sorted(by: {$0.fileId < $1.fileId}) // arr has all objects in Ascending order
 print("sorted array is",arr[0].fileId)// sorted array is 13
 print("sorted array is",arr[1].fileId)//sorted array is 14

さて、配列arrオブジェクトの fileId プロパティに 降順 onを適用します。降順に > symbol を使用します。

 arr = arr.sorted(by: {$0.fileId > $1.fileId}) // arr has all objects in Descending order
 print("Unsorted array is",arr[0].fileId)// Unsorted array is 14
 print("Unsorted array is",arr[1].fileId)// Unsorted array is 13

Swiftでは4.1。 &4.2ソート順の使用

let sortedArr = arr.sorted { (id1, id2) -> Bool in
  return id1.fileId < id2.fileId // Use > for Descending order
}
14
GSK

この配列を複数の場所でソートする予定がある場合は、配列型をComparableにすることをお勧めします。

class MyImageType: Comparable, Printable {
    var fileID: Int

    // For Printable
    var description: String {
        get {
            return "ID: \(fileID)"
        }
    }

    init(fileID: Int) {
        self.fileID = fileID
    }
}

// For Comparable
func <(left: MyImageType, right: MyImageType) -> Bool {
    return left.fileID < right.fileID
}

// For Comparable
func ==(left: MyImageType, right: MyImageType) -> Bool {
    return left.fileID == right.fileID
}

let one = MyImageType(fileID: 1)
let two = MyImageType(fileID: 2)
let twoA = MyImageType(fileID: 2)
let three = MyImageType(fileID: 3)

let a1 = [one, three, two]

// return a sorted array
println(sorted(a1)) // "[ID: 1, ID: 2, ID: 3]"

var a2 = [two, one, twoA, three]

// sort the array 'in place'
sort(&a2)
println(a2) // "[ID: 1, ID: 2, ID: 2, ID: 3]"
6
kwerle

もしあなたがカスタムオブジェクトを使用していなくて、代わりにComparableプロトコル(Int、Stringなど)を実装する値型を使用しているなら、あなたは単にこれをすることができます:

myArray.sort(>) //sort descending order

例:

struct MyStruct: Comparable {
    var name = "Untitled"
}

func <(lhs: MyStruct, rhs: MyStruct) -> Bool {
    return lhs.name < rhs.name
}
// Implementation of == required by Equatable
func ==(lhs: MyStruct, rhs: MyStruct) -> Bool {
    return lhs.name == rhs.name
}

let value1 = MyStruct()
var value2 = MyStruct()

value2.name = "A New Name"

var anArray:[MyStruct] = []
anArray.append(value1)
anArray.append(value2)

anArray.sort(>) // This will sort the array in descending order
5
dorian

私はこれをこのようにします、そしてそれは働きます:

var images = [imageFile]() images.sorted(by: {$0.fileID.compare($1.fileID) == .orderedAscending })

3
Illya Krit

カスタムオブジェクトの元の配列を並べ替えたい場合。これはSwift 2.1で別の方法があります

var myCustomerArray = [Customer]()
myCustomerArray.sortInPlace {(customer1:Customer, customer2:Customer) -> Bool in
    customer1.id < customer2.id
}

idは整数です。 Stringプロパティにも同じ<演算子を使用できます。

あなたはここで例を見ることによってその使用についてもっと学ぶことができます: Swift2:近隣の顧客

2
Hanny
var students = ["Kofi", "Abena", "Peter", "Kweku", "Akosua"]

students.sort(by: >)

print(students)

プリント:"["Peter", "Kweku", "Kofi", "Akosua", "Abena"]"

2

次の方法でfileIDプロパティからソートされた配列を返します。

スイフト2

let sortedArray = images.sorted({ $0.fileID > $1.fileID })

スイフト3 OR 4

let sortedArray = images.sorted(by: { $0.fileID > $1.fileID })

Swift 5.0

let sortedArray = images.sorted {
    $0.fileID < $1.fileID
}
1
Vicky Prajapati

スイフト3&4&5

私は小文字と大文字と小文字の関係で問題がありました

だから私はこのコードをやった

let sortedImages = images.sorted(by: { $0.fileID.lowercased() < $1.fileID.lowercased() })

そしてその後でsortedImagesを使う

0