2012-05-01 13 views
6

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

1

è 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.).

1

È 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.

+0

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

+0

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. –

+0

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

1

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.

+0

'consente agli utenti di ordinare le loro preferenze .. 'questo è più o meno quello che sto chiedendo. Inoltre, che cos'è un "Preferenza"? – Cratylus

+0

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

+0

Domanda aggiornata con più specifiche sulla definizione delle preferenze – ctorx

1

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:

  1. Usa PriorityQueue - Mentre l'aggiunta di Preferenza assegnare la priorità. Questa coda sarà presente nella classe Persona stessa
  2. Usa comparatore personalizzato (Come suggerito da @assylias)
  3. 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.
Problemi correlati