it-swarm-ja.com

複数の「タイブレーク」を含むデータセットの並べ替え

私は現在、Swiftで、いくつかの異なるタイプの並べ替えメカニズムを必要とするソフトウェアプロジェクトに取り組んでいます。タイブレークを使用して並べ替えを行うアルゴリズムを探していますが、役に立ちませんでした。言い換えると、次のように表すことができるデータセットがあるとします。

[Name Of Data]:[Someone's ID]-[Same Someone's Score],[Someone's ID]-[Same Someone's Score],[etc...]\n
[Name Of Data]:[Someone's ID]-[Same Someone's Score],[Someone's ID]-[Same Someone's Score],[etc...]\n
[etc...]

したがって、1行は次のようになります。

Wins:7-1,8-1,9-1,2-1,10-1,3-0,4-0,5-0,1-0,6-0

そして別のものはこのように見えます:

SpeakerPoints:6-26,2-20,4-19,7-17,8-16,9-16,5-16,1-12,3-11,10-8

IDを「勝者」の観点からソートできるようにしたいと思います。「勝者」の基準が最優先であり、同点の場合、プログラムは「SpeakerPoints」の基準に移動します。 。

通常、プラットフォーム固有のメカニズム(Windowsの場合はLINQ、MacOSの場合はNSSortDescriptorなど)を使用します。ただし、プロジェクトは「共有コード」であり、必要なプラットフォームでコンパイルする必要があります。重要な場合は、私は Silver を使用しています。これは、Windows/MacOS/iOS/Android/etc ...ターゲット用にコンパイルされるAppleのSwiftの実装です。私は基本的に「pureSwift」の使用に制限されています(Pure Swiftコードは完全にうまく機能します)。これを行うためにSortを実装するにはどうすればよいですか?アルゴリズムが非常に効率的であることは気にしません(単純な並べ替えにも数時間かかることは望ましくありませんが、自分で行うこともできます:P)、正しく並べ替えられたIDが返される限り、変更されたバブル並べ替えで問題ありません。

複雑なことに、基準の数も可変です。今回はwinsspeakerPointsの場合がありますが、次回はopponentWinsが含まれる場合があります。

2
Will

ソートアルゴリズムを実装する場合は、2つの入力が与えられた場合よりも大きい、等しい、または小さいを返す関数を作成するだけで済みます。勝利+スピーカーポイントなどの絶対値について心配する必要はありません。

したがって、注入されたものだけを使用する任意のソートアルゴリズム(たとえば、バブルソート)を使用または作成します。

IComparer
{
    Int Compare(x, y); // return 1,0,-1
}

次に、必要な具体的な実装を記述し、勝利を比較し、スピーカーポイントを比較します。

一連のIComparerを注入するより一般的なソリューションを想像できます。しかし、最初はシンプルに保つのが最善かもしれません。

1
Ewan