2016-07-14 6 views
0

Что было бы хорошим подходом/алгоритмом, позволяющим мне перебирать динамически меняющийся список.Loop over динамически меняющийся список

  • Этот список может содержать дубликаты
  • нужно только следующий элемент после текущего элемента. то есть если я в настоящее время на a[n] в следующей итерации, я хочу a[n] независимо

В настоящее время я пытался делать это (псевдо-код), который является довольно тривиальной
Однако, это не работает с дубликатами

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 

Я думаю об использовании связанного списка для этой проблемы. Вы порекомендовали бы другое решение или связанный список единственный способ?

Редактировать: Динамически меняя, я имею в виду, что содержимое списка whoes может быть изменено в середине цикла «i», следующего за вызовом nextItem(). Предположим только один поток.

+0

Не должна ли последняя строка возвращать c, а не d? Кроме того, я не понимаю, как в первом вызове 'nextItem()', 'list [6]' (поскольку currentItem = 5) выдавал бы ошибку, не так ли, потому что ее не существует? Если вы не хотите вернуться к первому элементу, когда он достигнет конца списка. – Ash

+0

@Ashwin_Nair да ваше право. Я только что исправил свою ошибку. Сначала у меня был список, заполненный номером, а затем сменил его на буквы, так как я чувствовал, что это сбивает с толку. Также currentItem является элементом в списке, а не индексом – Krimson

+0

Если бы я был вами, я бы изменил мой currentItem на использование индекса ... таким образом вам не нужно беспокоиться о дубликатах. Я добавлю реализацию C# в качестве ответа. – Ash

ответ

0

Это реализация C#. Он возвращается к началу, как только он достигает конца цикла. Вы можете изменить это, чтобы в конце сделать исключение или любое другое действие. В вашем примере, хотя вы используете элемент списка как ваш currentItem, тот факт, что это элемент списка, имеет значение только в первый раз.

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

Это не будет работать, если вы добавите элемент перед currentItem. Например 'list.Insert (0," z ")' – Krimson

+0

Я не уверен, что понимаю. предположим, что ваш список - '{a, b, c, d, e}' и 'nextItem' -' b' (второй элемент), а затем вы добавляете 'z' в начало, создавая свой список' {z, a, b, c, d, e} ',' nextItem' будет третьим элементом, который в этом случае снова будет 'b'. Ожидаете ли вы другого выхода? – Ash

+0

Да, выход должен быть «c». Не «b» снова – Krimson