Возврат урожая в Java

Я создал связанный список в 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 только.

51
задан Kasper Holdum 28 February 2010 в 09:57
поделиться

5 ответов

Я что-то упускаю? Уже существует java.util.LinkedList, он полностью поддерживает дженерики и имеет метод, который возвращает Iterator.

Если вы действительно хотите заново изобрести колесо, я бы посоветовал вам изучить возможность создания класса LinkedListIterator, возможно, реализующего ListIterator. Он запоминал свое текущее положение в связанном списке и продвигал его при каждом последующем вызове.

-30
ответ дан 7 November 2019 в 10:22
поделиться

попробуйте this

также проверьте эту статью, чтобы найти образец реализации:

14
ответ дан 7 November 2019 в 10:22
поделиться

Я не понимаю, почему люди говорят о потоках ... есть что-то, чего я не знаю о yield return?

Насколько я понимаю, yield return просто сохраняет стек методов и восстанавливает его позже. Чтобы реализовать возврат доходности, вам просто нужно сохранить состояние вручную. См. Подробности в классах итераторов Java, хотя для связанного списка вы можете просто сохранить текущий элемент. Для массива вам просто понадобится index.

5
ответ дан 7 November 2019 в 10:22
поделиться

Если вам нужна полная функциональность yield return , вам, вероятно, потребуется настроить это в двух потоках - один для первого метода, а другой - для второго. Затем первый поток должен подождать , пока второй поток не поместит свое значение в доступное место, и уведомит , что он готов. Затем первый поток обработает это значение, ждет следующего значения и т. Д.

-1
ответ дан 7 November 2019 в 10:22
поделиться

Я пытался понять, что делает 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;
    }

Я сбился с пути?

-1
ответ дан 7 November 2019 в 10:22
поделиться