Я создал связанный список в Java с помощью дженериков, и теперь я хочу быть в состоянии выполнить итерации по всем элементам в списке. В C# я использовал бы yield return
в связанном списке при осмотре через список элементов содержится в списке.
Как я пошел бы о создании версии Java вышеупомянутого, где я могу выполнить итерации по всем объектам, содержавшимся в связанном списке?
Я надеюсь быть в состоянии записать крыло кода
LinkedList<something> authors = new LinkedList<something>();
for (Iterator<something> i = authors.Values ; i.HasNext())
doSomethingWith(i.Value);
И думал, что Значение 'свойство, '/method, будет состоять из сходства кода
LinkedListObject<something> current = first;
While (current != null){
yield return current.getValue();
current = current.getNext()
}
Править: Заметьте, что я не интересуюсь использованием никаких сторонних API. Встроенная функциональность Java только.
Я что-то упускаю? Уже существует java.util.LinkedList, он полностью поддерживает дженерики и имеет метод, который возвращает Iterator.
Если вы действительно хотите заново изобрести колесо, я бы посоветовал вам изучить возможность создания класса LinkedListIterator, возможно, реализующего ListIterator. Он запоминал свое текущее положение в связанном списке и продвигал его при каждом последующем вызове.
попробуйте this
также проверьте эту статью, чтобы найти образец реализации:
Я не понимаю, почему люди говорят о потоках ... есть что-то, чего я не знаю о yield return?
Насколько я понимаю, yield return просто сохраняет стек методов и восстанавливает его позже. Чтобы реализовать возврат доходности, вам просто нужно сохранить состояние вручную. См. Подробности в классах итераторов Java, хотя для связанного списка вы можете просто сохранить текущий элемент. Для массива вам просто понадобится index.
Если вам нужна полная функциональность yield return
, вам, вероятно, потребуется настроить это в двух потоках - один для первого метода, а другой - для второго. Затем первый поток должен подождать
, пока второй поток не поместит свое значение в доступное место, и уведомит
, что он готов. Затем первый поток обработает это значение, ждет
следующего значения и т. Д.
Я пытался понять, что делает yield, но без опыта работы с C# я не уверен, есть ли он у меня, но я все равно попробую...
Я бы предложил следующее...
Something answer = null;
for (Something author: authors){
if (author.equals("Tom Jones"){
answer = author;
break;
}
}
Когда дело доходит до возврата значений из метода, я бы сделал следующее...
public LinkedList<something> getAuthors(LinkedList<something> list){
LinkedList<something> ret = new LinkedList<something>();
for (something s:list){
if (s.equals("abc"))
ret.add(s);
}
return ret;
}
Я сбился с пути?