2016-07-14 13 views
0

Was wäre ein guter Ansatz/Algorithmus, um mich über eine dynamisch wechselnde Liste zu ermöglichen.Schleife über dynamisch wechselnde Liste

  • Diese Liste kann Duplikate
  • enthalten Ich brauche nur das nächste Element nach dem aktuellen Element. dh wenn ich auf a[n] in der nächsten Iteration zur Zeit bin, mag ich a[n] unabhängig

Zur Zeit habe ich versucht, dies zu tun (Pseudo-Code), die
jedoch ziemlich trivial ist, es nicht mit Dubletten funktioniert

List<String> list = new List<String>(); 
list.add("a"); 
list.add("b"); 
list.add("c"); 
list.add("d"); 
list.add("e"); 

int currentItem = "a"; 

function nextItem(){ 
    int index = findIndex(currentItem); 
    currentItem = list[index+1]; 
    return currentItem; 
} 

print(nextItem()) #b 
print(nextItem()) #c 
list.addAt(3, "z") #add z at the 3rd index 
print(nextItem()) #z 
print(nextItem()) #d 
print(nextItem()) #e 

Ich denke über die Verwendung einer verknüpften Liste für dieses Problem. Würden Sie eine andere Lösung empfehlen oder ist eine verknüpfte Liste der einzige Weg?

Edit: Durch die dynamische Änderung, ich meine eine Liste Whoes Inhalt kann in der Mitte einer 'Schleife', d. H. Ein nextItem() Anruf moddifiziert werden. Nehme nur einen einzelnen Thread an.

+0

Sollte nicht die letzte Zeile c zurückgeben und nicht d? Außerdem verstehe ich nicht, wie im ersten Aufruf von 'nextItem()', 'list [6]' (da currentItem = 5) einen Fehler werfen würde, nicht wahr, da es nicht existiert? Es sei denn, Sie wollen zum ersten Element zurückkehren, wenn es das Ende der Liste erreicht. – Ash

+0

@Ashwin_Nair ja dein Recht. Ich habe gerade meinen Fehler korrigiert. Ich hatte die Liste zunächst mit Zahlen gefüllt und dann in Buchstaben geändert, da ich das Gefühl hatte, dass es verwirrend war. Auch currentItem ist das Element in der Liste und nicht der Index – Krimson

+0

Wenn ich Sie wäre, würde ich mein currentItem ändern, um einen Index zu verwenden ... auf diese Weise müssen Sie sich keine Gedanken über Duplikate machen. Ich füge eine C# Implementierung als Antwort hinzu. – Ash

Antwort

0

Dies ist eine C# -Implementierung. Es geht zurück zum Start, sobald es das Ende der Schleife erreicht. Sie können dies ändern, um am Ende eine Ausnahme oder eine andere Aktion auszulösen. In Ihrem Beispiel, obwohl Sie ein Listenelement als currentItem verwenden, ist die Tatsache, dass es sich um ein listElement handelt, nur beim ersten Mal von Bedeutung.

List<String> list = new List<String>(); 
    int currentItem = 5; // or InitializeCurrentItem {indexOf(listElementToSearchFor);} 
    static string nextItem() 
    { 
     //Handle case where the end of the loop is reached 
     if (currentItem == list.Count) currentItem = 0; 
     //Ensure current item is updated 
     return list[currentItem++]; 
    } 

    void Main() 
    { 

     list.Add("a"); 
     list.Add("b"); 
     list.Add("c"); 
     list.Add("d"); 
     list.Add("e"); 

     Console.WriteLine(nextItem()); //a 
     Console.WriteLine(nextItem()); //b 
     list.Insert(2, "z"); //add z at the 2nd index 
     Console.WriteLine(nextItem()); //z 
     Console.WriteLine(nextItem()); //c 
     Console.WriteLine(nextItem()); //d 
     Console.WriteLine(nextItem()); //e 
     Console.WriteLine(nextItem()); //a 
} 
+0

Das wird nicht funktionieren, wenn Sie ein Element vor dem currentItem hinzufügen. ZB 'list.Insert (0," z ")' – Krimson

+0

Ich bin mir nicht sicher, ob ich das verstehe. Angenommen, Ihre Liste ist '{a, b, c, d, e}' und Sie 'nextItem' zu' b' (das zweite Element) und dann fügen Sie 'z' am Anfang hinzu und machen Ihre Liste' {z, a, b, c, d, e} ', das' nextItem' wird das dritte Element sein, das in diesem Fall noch einmal 'b' ist. Erwarten Sie eine andere Ausgabe? – Ash

+0

Ja, die Ausgabe sollte "c" sein. Nicht wieder "b" – Krimson