"Miglior adattamento" per evitare il riutilizzo di istanze di oggetti in una raccolta

1

Immagina di avere una raccolta di istanze di oggetti che rappresentano attività che un utente può intraprendere. A seconda degli attributi dell'utente, devo selezionare casualmente le istanze per presentare attività all'utente.

Per alcuni utenti, ho bisogno di presentare più attività di quante siano le attività disponibili, nel qual caso, voglio usare il seguente algoritmo.

Se tutte le attività disponibili sono già state presentate all'utente, quindi selezionare nuovamente un'attività "utilizzata", selezionando la prima attività presentata ordinata per frequenza di utilizzo. In altre parole, cerca di ridurre la ripetizione e in cui la ripetizione è inevitabile, usa le istanze che sono state ripetute meno spesso e che sono state presentate più indietro nel tempo.

Prima di passare a codificare quell'algoritmo, mi sono chiesto se è possibile riutilizzare qualche schema esistente?

[EDIT] "Il più indietro nel tempo" non è rilevante poiché passerò all'algoritmo una raccolta ordinata di istanze utilizzate in cui la prima voce è la prima presentata.

    
posta Simon 29.10.2012 - 09:55
fonte

3 risposte

1

Game Coding Complete ha origine per Pseudo-Random Traversal di un Set che suona come quello che ti serve. Genera un elenco casuale di attività dal set, ma garantisce che ogni attività verrà visitata una volta prima che inizi a generare di nuovo la stessa attività.

    
risposta data 30.10.2012 - 17:17
fonte
0

Nella classe Activity implementa l'interfaccia Comparable , sovrascrivendo il metodo compareTo() .

Qui puoi scrivere la logica per indicare quando esattamente un'attività è minore o maggiore (ordinata) di altre.

Quindi lascia che l'API Java Collections torni la raccolta.

Come puoi vedere non c'è bisogno di due liste, una per le attività non utilizzate e altre per quelle usate, dato che l'ordine garantirà che dopo tutte le nuove attività saranno selezionate quelle usate in base alla loro frequenza d'uso.

    
risposta data 30.10.2012 - 17:40
fonte
0

Ci sono utenti e attività.

Le attività vengono visualizzate agli utenti in base agli attributi dell'utente.

Fondamentalmente, hai un algoritmo (strategia) per mostrare le attività all'utente.

Il primo passo è incapsulare il tuo algoritmo da qualche parte. Propongo di creare una classe chiamata UserActivityStrategy per la memorizzazione di questo algoritmo.

Quindi ottieni il tuo utente, ottieni le attività precedenti e passa quegli oggetti alla strategia che eseguirà il tuo algoritmo e restituirà i dati rilevanti.

var user = new User();
var previousActivities = new ActivityRepository().GetPreviousActivitiesForUser(user);

var proposedActivities = new UserActivityStrategy(previousActivities, user).GetActivities();

Non mi piace il fatto che sto passando sia le attività precedenti che l'utente alla strategia. Puoi refactoring incapsulando entrambi in una classe separata chiamata UserActivityHistory . Questa classe incapsulerebbe l'utente e le sue attività precedenti.

Questo è uno dei tanti modi per risolvere questo problema.

    
risposta data 31.10.2012 - 00:29
fonte

Leggi altre domande sui tag