2009-06-22 9 views
1

Die Anforderung, die ich habe, ist für jeden Typ T, ich habe eine Reihe von Elementen (zwischen 1-30 +) und zunächst brauche ich zufälliger Gegenstand, dann brauche ich den nächsten, und wenn ich den letzten Gegenstand erreiche, sollte er den ersten zurückgeben und so weiter.Wählen Sie die richtige Datenstruktur für dieses Problem: kreisförmige Liste, Liste, Array oder etwas anderes

Also sagen T ist Icon, und die Sammlung ist Images (Instanz).

Ich mag haben:

// program start: 

Icon icon = RandomIcon(); // say 5th one for this case 

// user clicks next icon: 

icon = current++; (6, 7, 8, 1, 2, ...) 

Für mich eine kreisförmige verkettete Liste sinnvoll ist, mit der Ausnahme, dass ich O zu tun habe (n), wobei n der Zufallsindex ist.

Ich möchte die sauberste, beste Implementierung haben, daher die Frage.

Antwort

2

Ich würde in Erwägung ziehen, eine benutzerdefinierte Klasse mit einem Array oder einer Liste <T> intern zu verwenden und einen benutzerdefinierten Enumerator zu erstellen, der bei jedem Index beginnt und die Schleife auflistet.

Der Hauptgrund, warum ich denke, das wäre besser als eine LinkedList mit dieser Linie zu tun hat:

Icon icon = RandomIcon(); // say 5th one for this case 

Es ist viel einfacher und performanter ein zufälliges Element aus einer einteilbar Sammlung als eine verknüpfte Liste zu erhalten .... Und mit 30 Elementen wird die Aufzählung in beiden Fällen schnell sein.

Um die Iteration in einem Kreis handhaben, alles, was Sie ist so etwas brauchen:

class CircularlyEnumerableList<T> 
{ 
    private List<T> list; 

    // Implement whatever you need for list... 

    IEnumerable<T> EnumerateFromElement(int index) 
    { 
     for (int i=index; i<list.Count; ++i) 
      yield return list[i]; 

     for (int i=0; i<index; ++i) 
      yield return list[i]; 
    } 
} 
+0

Danke Reed. Wie würde das "GetNextItem" in diesem Fall heißen? Ich muss die internen IEnumerable-Methoden aufrufen? –

+1

Joan: Nein. Ich werde meine Antwort bearbeiten, um es dir zu zeigen. –

+0

Danke Reed. Ich dachte irgendwie, du würdest foreach benutzen. Also in diesem Fall ist 2 für Schleifen besser als den zufälligen Index Code innerhalb des Enumerators setzen, richtig? Sollte der zufällige Index-Code im Konstruktor sein? Das ist was ich denke. –

5

Eine weitere mögliche Lösung besteht darin, eine verknüpfte Liste mit der zugrunde liegenden Datenstruktur zu erstellen, die ein Array ist. So können Sie Index in bei O kann (1), während die „Zirkularität“

Aufrechterhaltung
public class myLL 
{ 
    private T[] items; 
    private int i; 
    private int max_size; 

    public T GetCurrent() { 
     return items[i]; 
    } 

    public T GetNext() { 
     i = i++ % max_size; 
     return items[i]; 
    } 
} 
+1

Wenn (aus irgendeinem Grund) die Liste Größe variabel ist, und nicht vor der Zeit bekannt, List wird ähnlich haben Verhalten –

1
  • Kreiskarte ist gut
  • Da Sie rund 30 Elemente (und nicht wie 3000, sagen), könnten Sie eine indizierte Tabelle betrachten und nicht als eine verknüpfte Liste
    • Diese sofort funktioniert, wenn Ihre Elemente nicht halten hinzugefügt zu werden und entfernt
  • wenn Sie dynamische haben Verbündete eingefügt und Elemente gelöscht, könnten Sie noch etwas Code schreiben, um das zu handhaben (coz, kleine Liste)
  • Wenn das alles für Sie funktioniert, bleibt nur eine zufällige zwischen 1-N.

  • Wenn Ihr Artikel pro Liste zählen klein ist, wäre es eine über töten, eine lined
  • jedoch zu implementieren, wenn Sie sich entscheiden, dies zu tun, haben Sie immer einen ersten Traversal leisten konnten in der Liste nach dem zufällig ausgewählten Startpunkt
1

Warum eine verknüpfte Liste überhaupt verwenden? Verwenden Sie ein Array und speichern Sie den Index des aktuellen Elements. Wenn eine Funktion aufgerufen wird, um das nächste Element abzurufen, erhöhen Sie den Index. Wenn der Index größer als die Anzahl der Elemente ist, setzen Sie den Index auf Null.

+0

++ Einfach ist das Beste. Es ist erstaunlich, wie kompliziert einfache Dinge gemacht werden können. –

Verwandte Themen