Qual è il modo migliore per modellare priorità/preferenze in un dominio?
E.g. Supponiamo di avere una classe Person
che rappresenta una persona e ha alcune preferenze, ad es. PersonX
ama la pizza, gli spaggetti e l'omeleta e in realtà preferirebbe gli spaghetti sulla pizza.
Come vengono modellati questi modelli migliori?
Il primo pensiero sarebbe solo metterli in un List
(come variabile membro di Person
) mantenendo la preferenza in base all'ordine di inserimento, ad es. il primo nella lista è il più preferito, il secondo nella lista il secondo più preferito ecc. ma questo mi sembra troppo noioso. Per esempio. quando voglio fare ricerche o associazioni per preferenze ecc.
Forse c'è un approccio standard per problemi come questo?Qual è il modo migliore per rappresentare priorità/preferenze negli oggetti?
risposta
è possibile utilizzare la lista come avete proposto e aggiungere un metodo alla classe Person che sarebbe restituire un Comparator<Preference>
che sarebbe in grado di confrontare 2 preferenze per quella persona:
Person somebody.addPreference(pizzaPreference);
Person somebody.addPreference(omelettePreference);
....
Comparator<Preference> c = somebody.getPreferenceComparator();
boolean prefersPizzaOverOmelette = (c.compare(pizzaPreference, omelettePreference) > 0);
boolean hasNoPreferenceBetweenPizzaAndOmelette = (c.compare(pizzaPreference, omelettePreference) == 0);
E il comparatore sarebbe semplicemente controllare l'indice della preferenza nella tua lista (se contiene quella preferenza ecc.).
È possibile utilizzare un priority queue per rappresentare le priorità dell'oggetto e definire un valore appropriato per Comparator
per la classe che tenga conto delle regole descritte. La coda utilizza un heap prioritario che si occuperà di mantenere ordinati gli oggetti per priorità mentre vengono inseriti.
Utilizzare una struttura di classe come questo ... (pardon il sciatto Java ... Sono un ragazzo C#)
public class PersonPreference
{
public Preference preference;
public int rank;
}
Quindi, consentire agli utenti di ordinare le loro preferenze (da qui, la colonna rango), e ordinare su quella proprietà/colonna quando necessario.
EDIT
Guardando a questo nuovo, voglio ridefinire la mia classe. Una preferenza dovrebbe essere un utente di come in confronto ad un altro come ...
public class PersonLike
{
public string like;
public int rank;
}
Questa nuova classe definisce qualcosa che una persona ama, e permette per un rango in modo che quando si hanno molti esempi di questa classe (o un rappresentazione dei dati di esso), possono essere classificati, che in effetti, crea la preferenza, perché una preferenza è essenzialmente un utente che ama qualcosa su qualcos'altro. Un simile da solo non è una preferenza perché non viene confrontato con nient'altro.
Questo approccio consente di n interessi n classificati uno contro l'altro creando una vasta raccolta di preferenze.
'consente agli utenti di ordinare le loro preferenze .. 'questo è più o meno quello che sto chiedendo. Inoltre, che cos'è un "Preferenza"? – Cratylus
La preferenza può essere qualsiasi cosa .... ma guardando di nuovo la tua domanda, penso che rendere questa stringa libera sia meglio. In questo modo possono digitare "Pizza" o "Spaghetti", ecc ...., – ctorx
Domanda aggiornata con più specifiche sulla definizione delle preferenze – ctorx
Preference
nel suo complesso è un'entità completa a sé stante, sebbene non avrebbe alcun significato a meno che non sia associato a qualsiasi Person
ma possa vivere autonomamente.
Per quanto riguarda la priorità preferenza è interessato, Preference
non ha alcun Frittata di priorità, pizza sono tutti uguali, ma ha una priorità quando si è associato ad una persona (dire che mi piace più di Pizza frittata, dipende da me non su pizza o frittata).
Quindi si dispone di un oggetto Preference
e Person
.
Ora la preferenza varia da Persona a Persona in modo da associare Preferenza a Persona.
Poiché la priorità è molto dipendente persona si dispone di più opzioni per raggiungere:
- Usa PriorityQueue - Mentre l'aggiunta di Preferenza assegnare la priorità. Questa coda sarà presente nella classe Persona stessa
- Usa comparatore personalizzato (Come suggerito da @assylias)
- Aggiungi regole alle preferenze (in base alla posizione, genere, ecc.) E hanno regole preconfigurate che, quando vengono forniti determinati criteri, restituiscono la preferenza calcolata da System, sebbene abbia un override manuale di questo. In questo caso puoi semplicemente usare
PriorityQueue
.
- 1. qual è il modo migliore per rappresentare latice esagonale
- 2. Qual è il modo migliore per dividere due oggetti TimeSpan?
- 3. Qual è il modo migliore per rappresentare Middle Earth utilizzando il framework Locale di Java?
- 4. Qual è il modo migliore per rappresentare il puntatore come stringa in C++?
- 5. Qual è il modo migliore per ottenere una stringa formattata per rappresentare l'offset UTC?
- 6. qual è il modo per rappresentare un UNICHAR in lua
- 7. Qual è il modo migliore per rappresentare arbitrariamente grandi numeri in c?
- 8. Qual è il modo migliore per rilevare il colore bianco?
- 9. Qual è il modo migliore per reimparare una lingua?
- 10. Qual è il modo migliore per tracciare l'esecuzione di JavaScript?
- 11. Qual è il modo migliore per "ripristinare" le modifiche?
- 12. Qual è il modo migliore per organizzare più sottoview?
- 13. Qual è il modo migliore per documentare il codice f #?
- 14. Qual è il modo migliore per riutilizzare il parser Lua?
- 15. Qual è il modo migliore per testare un'app per rails?
- 16. Quando si esegue il porting del codice Java su ObjC, qual è il modo migliore per rappresentare le eccezioni controllate?
- 17. Qual è il modo migliore per rimuovere oggetti da un elenco
- 18. Qual è il modo migliore per navigare in un albero complesso di oggetti dissimili?
- 19. Qual è il modo migliore per gestire le dipendenze circolari tra gli oggetti?
- 20. Qual è il modo migliore per passare oggetti a "navigato a" viewmodel in MVVMCross?
- 21. Qual è il modo migliore per costruire un NSCompoundPredicate complesso?
- 22. qual è il modo migliore per implementare hashCode()?
- 23. Qual è il modo migliore per confrontare Double e Int?
- 24. Qual è il modo migliore per convertire enum in stringa?
- 25. Qual è il modo migliore per imparare CUDA?
- 26. Qual è il modo migliore per sviluppare un'applicazione web C++?
- 27. Qual è il modo migliore per simulare java.lang.Thread?
- 28. Qual è il modo migliore per chiudere un ramo Mercurial?
- 29. Qual è il modo migliore per creare frecce in inkscape?
- 30. Qual è il modo migliore per creare una ricerca whois?
Significa che ogni "Persona" ha un "PriorityQueue" associato? Inoltre, cosa succede se ho bisogno della seconda preferenza invece della preferenza 'max' per qualche ragione in qualche parte del flusso? – Cratylus
No, metti tutte le persone nella coda _one_ priority, l'ordine della coda sarà l'ordine delle loro priorità. Se hai bisogno del secondo più alto, fai scoppiare due persone dalla coda. Riguarda il modo in cui [gli heap] (http://en.wikipedia.org/wiki/Heap_ (data_structure)) funzionano, dai un'occhiata al link. –
Cosa intendi per "mettere tutte le persone in una coda prioritaria"? Ad esempio, è la 'priority queue' per' pizza'? Questo PQ appartiene a un oggetto? – Cratylus