2012-06-28 16 views
5

Dire di avere un elenco di oggetti. L'utente utilizza principalmente tutti gli oggetti quando sta lavorando. Come si può ordinare l'elenco degli oggetti, in modo che l'elenco si adatti all'ordine, gli utenti lo utilizzano principalmente? Quale algoritmo puoi usare per quello?Algoritmo per ordinare un elenco di oggetti

MODIFICA: molte risposte suggerivano di contare il numero di volte in cui un oggetto è stato utilizzato. Questo non funziona, perché tutti gli oggetti vengono utilizzati con la stessa quantità, solo in ordini diversi.

+0

Questo è davvero ampio. Hai un'idea di cosa stai cercando in particolare? Hai intenzione di ordinare per colonne preferite? O usare più di un approccio euristico? –

+0

'Elenco .Sort()?' – Habib

+0

Questi oggetti sono dello stesso tipo? Probabilmente potresti creare una classe base che erediterà tutti i tipi di oggetto e che esporrà la proprietà UsageCount (int).È quindi possibile incrememnt questo su ogni utilizzo e ordinare da esso – Dimitri

risposta

0

Aggiungi un elenco di data/ora di quando un utente accede a un oggetto. Ogni volta che un utente utilizza un oggetto, aggiunge un datetime.

Ora contate il numero di voci datetime nel vostro elenco che sono w (ora - x giorni) e ordinate per quello. È possibile eliminare i datet che sono> (ora - x giorni).

È possibile che un utente utilizzi articoli diversi in un mese, questo rifletterà tali cambiamenti.

+0

Questo non è ciò che vuole. Se uso l'oggetto A 100 volte e poi uso l'oggetto B una volta, l'oggetto B sarà in cima, mentre lui vuole che l'oggetto A sia in cima dato che è il più usato – Dimitri

+0

Abbastanza corretto, ha cambiato la mia risposta. – Carra

+0

Non voglio essere fastidioso, ma perché non aggiungere solo il campo int che verrà incrementato ogni volta che viene utilizzato un oggetto. quindi ordina il campo :) – Dimitri

2

All'interno dell'oggetto, mantenere un valore usedCount. Ogni volta che si utilizza l'oggetto, aumentare questo conteggio. allora si può semplicemente fare questo:

objects.OrderByDescending(o => o.UsedCount); 
0

È possibile aggiungere un campo NUMBER_OF_VIEWS alla classe di oggetti, ++ ogni volta dell'oggetto lista usata e ordinare in base a quel campo. E dovresti rendere questo campo = 0 a tutti gli oggetti quando number_of_views a tutti gli oggetti è lo stesso ma non è 0.

0

Vorrei anche usare un contatore per ogni oggetto per monitorarne l'uso, ma invece di riordinare l'intero elenco dopo ogni utilizzo, consiglierei di ordinare l'elenco "localmente". Come in un bubble sort, vorrei semplicemente confrontare l'oggetto il cui contatore era appena aumentato con l'oggetto superiore, e scambiarli se necessario. Se lo scambio, vorrei quindi confrontare l'oggetto e il suo nuovo oggetto superiore e così via.

Tuttavia, non è molto diverso dai metodi precedenti se l'ordinamento è correttamente implementato.

0

Se la classe utente si presenta in questo modo:

class User 
{ 
    Collection<Algo> algosUsed = new List<Algo>();  //Won't compile, used for explanation 
    ... 
} 

E la classe Algo si presenta in questo modo:

class Algo 
{ 
    int usedCount; 
... 
} 

Si dovrebbe essere in grado di legare istanze specifiche dell'oggetto Algo all'oggetto User che consentono la registrazione di quanto spesso viene utilizzato. Al livello più elementare si serializzerebbe l'informazione in un file o in un flusso. Molto probabilmente vuoi un database per tenere traccia di ciò che viene utilizzato. Poi, quando si afferra la tua User e richiamare una funzione sort ordinate il algos param del User dal usedCount param di Algo

+0

Il problema è che tutti gli oggetti sono utilizzati in modo uguale, quindi il valore usato per ogni oggetto è lo stesso. solo l'ordine di utilizzo varia ... –

+0

@TombiUnnso Consiglierei di ripensare il design dell'applicazione. – Woot4Moo

0

EDIT: Aggiunto un Ordine preferrence !!! guarda nel CODICE

Non mi piace l'ultimo metodo usato come ha detto Carra perché infligge molte modifiche di sorta che creano confusione.

il campo count_accessed è molto meglio, anche se penso che dovrebbe essere livellato a
quante volte l'utente ha effettuato l'accesso a questo elemento negli ultimi XX minuti/ore/giorni Etc ...

il meglio datastructure di ciò è sicuramente

static TimeSpan TIME_TO_LIVE; 
    static int userOrderFactor = 0; 

    LinkedList<KeyValuePair<DateTime, int>> myAccessList = new  LinkedList<KeyValuePair<DateTime, int>>(); 

    private void Access_Detected() 
    { 
     userOrderFactor++; 
     myAccessList.AddLast(new KeyValuePair<DateTime, int>(DateTime.Now, userOrderFactor)); 
     myPriority += userOrderFactor; // take total count differential, so we dont waste time summing the list 
    } 



    private int myPriority = 0; 
    public int MyPriority 
    { 
     get 
     { 
      DateTime expiry = DateTime.Now.Subtract(TIME_TO_LIVE); 
      while (myAccessList.First.Value.Key < expiry) 
      { 
       myPriority += myAccessList.First.Value.Value; // take care of the Total Count 
       myAccessList.RemoveFirst(); 
      } 
      return myPriority; 
     } 
    } 

Spero che questo aiuti ... è quasi sempre O (1) A proposito ...
mi ricorda un po 'il meccanismo sonno dei sistemi operativi

+0

Supponiamo che un utente lavori un anno con l'elenco. L'elenco dovrebbe quindi essere ordinato in base alla probabilità di diverse possibilità da tutti gli esempi di allenamento ... –

+0

Ogni volta che si desidera spingere un oggetto, è possibile chiamare Access_Detected() questo aumenterà il conteggio di Elenco collegato => il migliore Probabilmente l'elemento è il primo ... ma quello che ho cercato di ottenere è che gli elementi che sono stati molto attivi "molto tempo fa" saranno "obsoleti" rispetto agli articoli attuali. –

+0

Nodo su Modifica ... la Priorità Inferiore è, più utile è l'oggetto –

0

Sembra che tu voglia un cache. Spero che tu possa guardare gli algoritmi utilizzati da una cache e poi eliminare l'intera attività sul cambio di contesto ... c'è un algoritmo chiamato "sweep dell'orologio" ... ma meh potrebbe essere tutto troppo complesso per quello che stai cercando . Per andare in modo pigro, direi solo creare un hash di "cosa usata": num_of_uses o, nella tua classe, avere una var tu ++ ogni volta che l'oggetto viene usato.

Ogni tanto ordina l'hash di num_of_uses o degli oggetti in base al valore della loro variabile ++ 'd.

1

Vorrei tenere un conto corrente di quante volte è stato utilizzato l'oggetto e in quale ordine è stato utilizzato.

Quindi, se l'oggetto X è stato utilizzato per il terzo, calcolare la media con il conteggio parziale e utilizzare il risultato come posizione nell'elenco.

Ad esempio:

 
Item  Uses  Order of Use 
--------------------------------------- 
Object X 10  1,2,3,1,2,1,3,1,2,2 (18) 
Object Y 10  3,1,2,3,3,3,1,3,3,1 (23) 
Object Z 10  2,3,1,2,1,2,2,2,2,3 (20) 

usi sarebbero quante volte l'utente ha utilizzato l'oggetto, l'ordine di utilizzo sarebbe una lista (o somma) di cui l'articolo viene utilizzato nell'ordine.

L'utilizzo di un elenco di ciascun ordine singolarmente potrebbe presentare alcuni problemi di prestazioni, pertanto è possibile che si desideri mantenere una somma delle posizioni. Se si mantiene una somma, basta aggiungere l'ordine a tale somma ogni volta che viene utilizzato l'oggetto.

Per calcolare la posizione, utilizzare la somma delle posizioni, divisa per il numero di utilizzi e la media. Tutto quello che dovresti fare a quel punto è ordinare la lista in base alla media.

Nell'esempio di cui sopra, si otterrebbe le seguenti medie (e fine):

 
Object X 1.8 
Object Z 2.0 
Object Y 2.3 
0

Quando un utente interagisce con un oggetto, salvare l'ID dell'oggetto precedente agito su su quel secondo oggetto in modo che hai sempre un puntatore all'oggetto usato prima di ogni oggetto dato.

Inoltre, memorizzare l'ID dell'oggetto utilizzato più di frequente in modo da sapere da dove iniziare.

Quando si crea l'elenco di oggetti da visualizzare, si inizia con quello archiviato come l'oggetto utilizzato più di frequente, quindi si cerca l'oggetto che ha l'ID dell'oggetto utilizzato per primo in esso memorizzato da visualizzare Il prossimo.

Problemi correlati