Автор Гілка: Як у джаві зберегти позицію ітератора, щоб пізніше відновити її  (Прочитано 10302 раз)

Відсутній lpi3

  • Новачок
  • *
  • дописів: 30
  • Карма: +0/-0
Вітаю!

Чи можливо якимось чимось зберегти позицію ітератора для linkedlist, щоб пізніше її відновити?
Я шукав у гуглі, але якось безрезультатно. Може хтось стикався і щось порадить?

Дякую.

Миха́йло Даниле́нко

  • Гість
Не java'ist, але можна трохи більше контексту? Ви проходите по списку, і під час проходу вам треба відкотитися назад? Чи ви щось робите, перериваєте цикл, і потім хочете його відновити? Чи це взагалі між різними запусками програми?

Відсутній lpi3

  • Новачок
  • *
  • дописів: 30
  • Карма: +0/-0
Пишу парсер, і хотілося б що була можливість брати дані з різник колекцій або масивів.Поступово застосовую різні можливі парсери, а також (інколи) їх комбінації.
І в момент, коли один з парсерів не спрацював треба відновлювати стан ітератора і передавати його наступному парсеру.
Ось трохи змінений шматок коду. Index зараз працює тільки з масивами і замість ітератора просто індекс. У попередній версії були ітератори, але їх не можна скопіювати як число і відповідно відновлення стану ітератора не спрацьовувало.

Код: Java
  1. public static class Index<T> {
  2.   public T[] value;
  3.   public int current;
  4.   public Index(T[] t) {value = t; current = 0;}
  5. }
  6.  
  7. public static <T,U> Instance<LinkedList<T>,U> many(Instance<T,U> p) {
  8.   return new Instance<LinkedList<T>,U> ((Index<U> u) -> {
  9.     LinkedList<T> ret = new LinkedList<T> ();
  10.     while (true) {
  11.       int current = u.current;
  12.       Maybe<T> r = p.fn.apply(u);
  13.       if (r.value != null) {
  14.         ret.add(r.value);
  15.       } else {
  16.         u.current = current;
  17.         return new Maybe<LinkedList<T>> (ret);
  18.       }
  19.     }
  20.   });
  21. }
  22.  
  23. public static <T,U> Instance<T,U> option(Instance<T,U> p1, Instance<T,U> p2) {
  24.   return new Instance<T,U> ((Index<U> u) -> {
  25.     if (u.value.length == u.current) {
  26.       return new Maybe<T> ();
  27.     } else {
  28.       int current = u.current;
  29.       Maybe<T> r = p1.fn.apply(u);
  30.       if (r.value != null) {
  31.         return r;
  32.       } else {
  33.         u.current = current;
  34.         return p2.fn.apply(u);
  35.       }
  36.     }
  37.   });
  38. }