Java listIterator () дает мне странные результаты с .next () и .prev () - PullRequest
0 голосов
/ 11 апреля 2020

Я работал над проектом, в котором я реализовал (двусвязный список) с нуля с отдельным «классом узла».

Затем я дошел до того, что мне нужно отсортировать мой «Связанный список узлов». Поскольку я реализовал свой Связанный список с нуля, поэтому для его сортировки мне также необходимо реализовать «Сортировку слиянием» с нуля и для моего Связанного списка, что занимает немного времени.

Поэтому я подумал об использовании "Java Linked List" из java .util с listIterator (), а затем использовал Collections.sort () для сортировки моего LinkedList, но его next () и previous () дают мне неожиданные странные результаты по сравнению с тем, когда я просматривал свой LinkedList узлов с прямым доступом, используя (.next) & (.prev). Например, скажем:

node1.time = 7;
node2.time = 8;
node3.time = 9;
node4.time = 10;

LinkedList<Node> nodeList = new LinkedList<Node>():
nodeList.add(node1); nodeList.add(node2); nodeList.add(node3); nodeList.add(node4);

void testFunction() {

  ListIterator<Node> nodesIterator = nodeList.listIterator();

  Node current;

  for (int i = 0; i < 2; i++) {
    current = nodesIterator.next();
    System.out.println("current = " + current.time);
  }
  System.out.println("outside of loop:"); 

  System.out.println("move current backward:");
  current = nodesIterator.previous();
  System.out.println("current = " + current.time);

  System.out.println("move current forward:");
  current = nodesIterator.next();
  System.out.println("current = " + current.time);

  System.out.println("Passing nodesIterator into testFunction2():");
  testFunction2(nodesIterator);   
}


void testFunction2(ListIterator<Node> nodesIterator) {

  System.out.println("inside testFunction2():");

  Node current = nodesIterator.next();
  System.out.println("current = " + current.time);

  System.out.println("move current backward:");
  current = nodesIterator.previous();
  System.out.println("current = " + current.time);

  System.out.println("move current backward again:");
  current = nodesIterator.previous();
  System.out.println("current = " + current.time);
}

Выходы:

current = 7
current = 8

outside of loop:

move current backward:
current = 8
 // -> current is suppose to be 7 if previous current inside the loop was 8?

move current forward:
current = 8
 // -> current is suppose to be 9 if previous current = 8?

Passing nodesIterator into testFunction2():

inside testFunction2():
current = 9
 // -> guess it's correct since previous current = 8?

move current backward:
current = 9
 // -> suppose to give me 8 since previous current = 9?

move current backward again:
current = 8
 // -> now it actually moved backward!

Что происходит с Java next () & prev ()? Мой Связанный список, реализованный с нуля, никогда бы не дал мне этих проблем, плюс передача узлов другим функциям для обхода намного проще с прямым доступом к (.next) & (.prev), так как я могу просто передать (node.next) или ( node.prev) к другим функциям без необходимости передавать ссылку на listIterator (), чтобы связать мой список узлов.

Должен ли я придерживаться своего связанного списка с нуля и просто закодировать «Объединить сортировку»

1 Ответ

3 голосов
/ 11 апреля 2020

Документация для ListIterator объясняет эту проблему. По сути, «текущее» местоположение - это не один узел, а между двумя узлами. В частности, это между узлами, которые будут возвращены, если вы позвоните prev() или если вы позвоните next(). Например, после первых двух вызовов next() ваш итератор будет выглядеть следующим образом:

7 -> 8 *->* 9 -> 10 Ток находится между 8 и 9.

Вызов prev() вернется предыдущий узел, который является 8. Тогда итератор будет выглядеть следующим образом:

7 *->* 8 -> 9 -> 10 Ток находится между 7 и 8.

После повторного вызова next() снова вернется 8, и скоро. Это сделано специально, и вам придется учитывать это при обходе ListIterator.

...