What's the Difference Between Iterator and Listiterator? (#14547)

This commit is contained in:
Kai Yuan 2023-08-09 02:05:39 +02:00 committed by GitHub
parent e10a895ba0
commit 4945be2fd6
3 changed files with 134 additions and 4 deletions

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>core-java-collections-list-5</artifactId>
<name>core-java-collections-list-5</name>
@ -42,11 +42,33 @@
<version>1.18.26</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>${gson.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>${org.json.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
<properties>
<jmh.version>1.21</jmh.version>
<commons-lang.version>2.2</commons-lang.version>
<commons-lang3.version>3.12.0</commons-lang3.version>
<gson.version>2.10.1</gson.version>
<jackson.version>2.15.2</jackson.version>
<org.json.version>20230618</org.json.version>
</properties>
</project>

View File

@ -0,0 +1,108 @@
package com.baeldung.java.iteratorandlistiterator;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import org.junit.jupiter.api.Test;
import com.google.common.collect.Lists;
public class IteratorVsListIteratorUnitTest {
@Test
void whenUsingIterator_thenWeCanTraverseForwardsAndRemoveElements() {
List<String> inputList = Lists.newArrayList("1", "2", "3", "4", "5");
Iterator<String> it = inputList.iterator();
while (it.hasNext()) {
String e = it.next();
if ("3".equals(e) || "5".equals(e)) {
it.remove();
}
}
assertEquals(Lists.newArrayList("1", "2", "4"), inputList);
}
@Test
void whenUsingListIteratorAlternatingNextAndPrevious_thenAlwaysGetTheSameElement() {
List<String> inputList = Lists.newArrayList("1", "2", "3", "4", "5");
ListIterator<String> lit = inputList.listIterator(); // ^ 1 2 3 4 5
lit.next(); // 1 ^ 2 3 4 5
lit.next(); // 1 2 ^ 3 4 5
for (int i = 1; i <= 100; i++) {
assertEquals("2", lit.previous());
assertEquals("2", lit.next());
}
}
@Test
void whenUsingListIterator_thenRetrieveElementInForwardAndBackwardDirection() {
List<String> inputList = Lists.newArrayList("1", "2", "3", "4", "5");
ListIterator<String> lit = inputList.listIterator(); // ^ 1 2 3 4 5
assertFalse(lit.hasPrevious()); // lit is at the beginning of the list
assertEquals(-1, lit.previousIndex());
assertEquals("1", lit.next()); // after next(): 1 ^ 2 3 4 5
assertEquals("2", lit.next()); // after next(): 1 2 ^ 3 4 5
assertEquals("3", lit.next()); // after next(): 1 2 3 ^ 4 5
assertTrue(lit.hasPrevious());
assertEquals(2, lit.previousIndex());
assertEquals("3", lit.previous()); // after previous(): 1 2 ^ 3 4 5
assertTrue(lit.hasPrevious());
assertEquals(1, lit.previousIndex());
assertEquals("2", lit.previous()); // after previous(): 1 ^ 2 3 4 5
assertTrue(lit.hasPrevious());
assertEquals(0, lit.previousIndex());
assertEquals("1", lit.previous()); // after previous(): ^ 1 2 3 4 5
}
@Test
void whenUsingSetElement_thenGetExpectedResult() {
List<String> inputList = Lists.newArrayList("1", "2", "3", "4", "5");
ListIterator<String> lit = inputList.listIterator(1); // ^ 1 2 3 4 5
lit.next(); // 1 ^ 2 3 4 5
assertEquals("3", lit.next()); // 1 2 ^ 3 4 5
lit.set("X");
assertEquals(Lists.newArrayList("1", "2", "X", "4", "5"), inputList);
assertEquals("X", lit.previous()); // 1 2 ^ X 4 5
assertEquals("2", lit.previous()); // 1 ^ 2 X 4 5
lit.set("Y");
assertEquals(Lists.newArrayList("1", "Y", "X", "4", "5"), inputList);
}
@Test
void whenUsingAddElement_thenGetExpectedResult() {
List<String> inputList = Lists.newArrayList("1", "2", "3", "4", "5");
ListIterator<String> lit = inputList.listIterator(); // ^ 1 2 3 4 5
lit.next(); // 1 ^ 2 3 4 5
lit.next(); // 1 2 ^ 3 4 5
lit.next(); // 1 2 3 ^ 4 5
lit.add("X"); // 1 2 3 X ^ 4 5
assertEquals("4", lit.next()); // 1 2 3 X 4 ^ 5
lit.previous(); // 1 2 3 X ^ 4 5
lit.previous(); // 1 2 3 ^ X 4 5
lit.previous(); // 1 2 ^ 3 X 4 5
lit.add("Y"); // 1 2 Y ^ 3 X 4 5
assertEquals("Y", lit.previous());
assertEquals(Lists.newArrayList("1", "2", "Y", "3", "X", "4", "5"), inputList);
}
}

View File

@ -13,7 +13,7 @@ import org.junit.Test;
import com.baeldung.list.Country;
public class ListContainsElementFromOtherListTest {
public class ListContainsElementFromOtherListUnitTest {
final private List<String> listOfLetters = Arrays.asList("a", "b", "c", "d");
final private List<String> listOfLettersWithOverlap = Arrays.asList("d", "e", "f", "g");
@ -65,4 +65,4 @@ public class ListContainsElementFromOtherListTest {
assertTrue(shouldBeTrue);
}
}
}