Ordinamento di un set di dati con più "tie break"

2

Attualmente sto lavorando a un progetto software che richiede diversi tipi di meccanismi di ordinamento. Ho cercato, inutilmente, di trovare un algoritmo per fare una sorta di tie-break. In altre parole, diciamo che hai un set di dati che potrebbe essere rappresentato in questo modo:

[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...]

Una linea, quindi, può avere questo aspetto:

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

E un altro ha questo aspetto:

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

Mi piacerebbe essere in grado di ordinare gli ID in termini di "vincitore", dove il criterio "Vincite" è la priorità 1, e se c'è un pareggio, il programma passerebbe ai criteri "Punti Speaker", e così su ...

Normalmente utilizzerei un meccanismo specifico per piattaforma (come LINQ per Windows o NSSortDescriptor per MacOS). Tuttavia, il progetto è "Codice condiviso" che dovrebbe essere compilato su qualsiasi piattaforma necessaria. Se è importante, sto utilizzando Silver , un'implementazione del Swift di Apple che compila per Windows / MacOS / iOS / Android / etc ... target, quindi fondamentalmente sono limitato all'utilizzo di "pure swift" (il codice di swift puro funziona perfettamente). Come posso implementare un Sort per farlo? Non mi interessa che l'algoritmo sia super efficiente (anche se non voglio che un semplice tipo impieghi delle ore, potrei farlo io stesso: P), un ordinamento di bolle modificato andrebbe bene fintanto che restituisse il corretto ordinato di. ID

Come complicazione, il numero di criteri è anche una variabile: questa volta potrebbe essere wins e speakerPoints , ma la prossima volta potrebbe includere opponentWins

    
posta Will 11.08.2016 - 05:53
fonte

1 risposta

1

Quando si implementa un algoritmo di ordinamento, è sufficiente creare una funzione che restituisca maggiore, uguale o minore rispetto a quando vengono forniti due input. Non devi preoccuparti del valore assoluto delle vincite + punti di speaker + qualunque cosa.

Quindi usa o crea un algoritmo di ordinamento arbitrario (ad esempio, un ordinamento di bolle) che usa solo un iniettato:

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

Quindi puoi scrivere un'implementazione concreta con il necessario, confrontare le vittorie, confrontare i punti di discussione ecc.

Puoi immaginare più soluzioni genetiche in cui iniettare una serie di IComparer. Ma potrebbe essere meglio mantenerlo semplice per cominciare.

    
risposta data 11.08.2016 - 16:14
fonte

Leggi altre domande sui tag