別の配列から注文してSwift配列を並べ替える

ピアニスト

カスタムクラスの配列があり[Player]、それぞれに次の文字列プロパティが含まれているとします。player.position

またpositionOrders、次のように、と呼ばれる任意の値の配列があります

let positionOrders = ["QB", "WR", "RB", "TE"]

私の目標は、[Player]最初にすべての「QB」、次に「WR」、「RB」、最後に「TE」になるように並べ替えることです。

現在の方法では、の各要素をループしpositionOrders、その内部ですべてのプレーヤーをループして新しい配列に追加します。しかし、これを行うためのより簡単な(そしてより効率的な)方法を見つけることができませんでした。ヒントやポインタは大歓迎です。ありがとう。

アレクサンダー-モニカを復活させる

編集:私の元のアプローチはたわごとでした。この投稿は多くの注目を集めたので、もう少し注意を払い、改善する時が来ました。


基本的に、問題は簡単です。2つの要素がありCollection、相対的な順序によって並べ替え順序が決まる配列(または任意の順序付き)があります。すべての要素について、順序付けられたコレクション内でその位置を見つけ、2つのインデックスを比較して、どちらが「大きい」かを判断します。

ただし、単純に線形検索を実行すると(たとえば)、特に固定順序が非常に大きい場合は、Array.firstIndex(of:)パフォーマンスが非常に悪くなります(O(array.count))。これを修正するために、Dictionary要素をインデックスにマップするを作成できます。辞書はO(1)、仕事に最適な高速ルックアップを提供します

これはまさに何をするかHardCodedOrderingです。要素の辞書をそれらの順序に事前に計算し、2つの要素を比較するためのインターフェースを提供します。さらに良いことに、順序が不明な要素の検出に対して異なる応答をするように構成できます。それらを最初に配置するか、最後に配置するか、完全にクラッシュする可能性があります(デフォルトの動作)。

HardCodedOrdering

public struct HardCodedOrdering<Element> where Element: Hashable {
    public enum UnspecifiedItemSortingPolicy {
        case first
        case last
        case assertAllItemsHaveDefinedSorting
    }

    private let ordering: [Element: Int]
    private let sortingPolicy: UnspecifiedItemSortingPolicy

    public init(
        ordering: Element...,
        sortUnspecifiedItems sortingPolicy: UnspecifiedItemSortingPolicy = .assertAllItemsHaveDefinedSorting
    ) {
        self.init(ordering: ordering, sortUnspecifiedItems: sortingPolicy)
    }

    public init<S: Sequence>(
        ordering: S,
        sortUnspecifiedItems sortingPolicy: UnspecifiedItemSortingPolicy = .assertAllItemsHaveDefinedSorting
    ) where S.Element == Element {

        self.ordering = Dictionary(uniqueKeysWithValues: zip(ordering, 1...))
        self.sortingPolicy = sortingPolicy
    }

    private func sortKey(for element: Element) -> Int {
        if let definedSortKey = self.ordering[element] { return definedSortKey }

        switch sortingPolicy {
            case .first:    return Int.min
            case .last:     return Int.max

            case .assertAllItemsHaveDefinedSorting:
                fatalError("Found an element that does not have a defined ordering: \(element)")
        }
    }

    public func contains(_ element: Element) -> Bool {
        return self.ordering.keys.contains(element)
    }

    // For use in sorting a collection of `T`s by the value's yielded by `keyDeriver`.
    // A throwing varient could be introduced, if necessary.
    public func areInIncreasingOrder<T>(by keyDeriver: @escaping (T) -> Element) -> (T, T) -> Bool {
        return { lhs, rhs in
            self.sortKey(for: keyDeriver(lhs)) < self.sortKey(for: keyDeriver(rhs))
        }   
    }

    // For use in sorting a collection of `Element`s
    public func areInIncreasingOrder(_ lhs: Element, rhs: Element) -> Bool {        
        return sortKey(for: lhs) < sortKey(for: rhs)
    }
}

使用例:


let rankOrdering = HardCodedOrdering(ordering: "Private", "Lieutenant", "Captain", "Admiral") // ideally, construct this once, cache it and share it

let someRanks = [
    "Admiral", // Should be last (greatest)
    "Gallactic Overlord", // fake, should be removed
    "Private", // Should be first (least)
]
let realRanks = someRanks.lazy.filter(rankOrdering.contains)
let sortedRealRanks = realRanks.sorted(by: rankOrdering.areInIncreasingOrder) // works with mutating varient, `sort(by:)`, too.

print(sortedRealRanks) // => ["Private", "Admiral"]

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

別の配列を参照して配列を並べ替える

分類Dev

ある配列を別の配列と比較して並べ替えてから、その配列内で並べ替えます

分類Dev

Swift別の配列に基づいて配列を並べ替える

分類Dev

別の配列からの配列の並べ替えを最適化する

分類Dev

PHPで別の配列を比較して配列を並べ替える

分類Dev

Swift、インデックス付きの配列を使用して別の配列を並べ替える方法

分類Dev

別の方法で並べ替えられた配列を並べ替える

分類Dev

ある列に基づいてnumpy配列を並べ替えてから、別の列に基づいてサブ並べ替える最良の方法は?

分類Dev

別の配列を使用して多次元配列を並べ替える

分類Dev

別の配列の値で配列を並べ替える

分類Dev

別の配列の順序で配列を並べ替える

分類Dev

別の外観に応じて配列を並べ替える

分類Dev

別の配列に基づいて複数の配列を並べ替える並べ替え順序

分類Dev

別の配列の並べ替え順序に基づいて配列を並べ替える

分類Dev

PHP-配列を別の配列で並べ替える

分類Dev

javascriptの別の配列に従って配列を並べ替える方法は?

分類Dev

Swiftで配列の配列を並べ替える方法は?

分類Dev

ファイルから整数の配列を並べ替えて、別のファイルに返します

分類Dev

ある配列を別の配列で並べ替え、不明な不足している項目を追加する

分類Dev

他の並べ替えられた配列に基づいて配列を並べ替える

分類Dev

別の配列を使用してオブジェクトの固定配列を並べ替える

分類Dev

参照用に別の配列を使用してオブジェクトの配列を並べ替える方法は?

分類Dev

配列を特定の列で並べ替えてから、この列の値で並べ替えます

分類Dev

配列を並べ替えて元の配列と比較する

分類Dev

最初の配列に従って配列を並べ替える

分類Dev

floatの配列を使用してintの配列を並べ替える

分類Dev

別の配列を使用して配列要素を並べ替えるルビーソート

分類Dev

2D配列でnumpy.argsortを使用して別の2D配列を並べ替える方法

分類Dev

linqを使用してList <string>の配列を並べ替える

Related 関連記事

  1. 1

    別の配列を参照して配列を並べ替える

  2. 2

    ある配列を別の配列と比較して並べ替えてから、その配列内で並べ替えます

  3. 3

    Swift別の配列に基づいて配列を並べ替える

  4. 4

    別の配列からの配列の並べ替えを最適化する

  5. 5

    PHPで別の配列を比較して配列を並べ替える

  6. 6

    Swift、インデックス付きの配列を使用して別の配列を並べ替える方法

  7. 7

    別の方法で並べ替えられた配列を並べ替える

  8. 8

    ある列に基づいてnumpy配列を並べ替えてから、別の列に基づいてサブ並べ替える最良の方法は?

  9. 9

    別の配列を使用して多次元配列を並べ替える

  10. 10

    別の配列の値で配列を並べ替える

  11. 11

    別の配列の順序で配列を並べ替える

  12. 12

    別の外観に応じて配列を並べ替える

  13. 13

    別の配列に基づいて複数の配列を並べ替える並べ替え順序

  14. 14

    別の配列の並べ替え順序に基づいて配列を並べ替える

  15. 15

    PHP-配列を別の配列で並べ替える

  16. 16

    javascriptの別の配列に従って配列を並べ替える方法は?

  17. 17

    Swiftで配列の配列を並べ替える方法は?

  18. 18

    ファイルから整数の配列を並べ替えて、別のファイルに返します

  19. 19

    ある配列を別の配列で並べ替え、不明な不足している項目を追加する

  20. 20

    他の並べ替えられた配列に基づいて配列を並べ替える

  21. 21

    別の配列を使用してオブジェクトの固定配列を並べ替える

  22. 22

    参照用に別の配列を使用してオブジェクトの配列を並べ替える方法は?

  23. 23

    配列を特定の列で並べ替えてから、この列の値で並べ替えます

  24. 24

    配列を並べ替えて元の配列と比較する

  25. 25

    最初の配列に従って配列を並べ替える

  26. 26

    floatの配列を使用してintの配列を並べ替える

  27. 27

    別の配列を使用して配列要素を並べ替えるルビーソート

  28. 28

    2D配列でnumpy.argsortを使用して別の2D配列を並べ替える方法

  29. 29

    linqを使用してList <string>の配列を並べ替える

ホットタグ

アーカイブ