Table of Contents
ToggleJava Remove Items From List
迴圈內移除條件相符合的元素,會拋出 ConcurrentModificationException 例外,提供幾種 Remove an Element from ArrayList 刪除元素的方法,本篇增加了範例,並透過單元測試來驗證產出結果。
檔案目錄
./
+- src
+- test
| +- org
| +- ruoxue
| +- java_147
| +- list
| +- RemoveItemsFromListTest.java
單元測試
Remove an Element from ArrayList 移除條件相符合的元素。
removeThrowException
建立一個 ArrayList ,內有三個元素,迴圈內移除條件相符合的元素,會拋出 ConcurrentModificationException 例外。
@Test(expected = ConcurrentModificationException.class)
public void removeThrowException() {
int expectedSize = 2;
List<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
list.add("Cherry");
for (String e : list) {
if ("Apple".equals(e)) {
list.remove(e);
}
}
System.out.println(list);
assertEquals(expectedSize, list.size());
}
java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:911)
at java.util.ArrayList$Itr.next(ArrayList.java:861)
at org.ruoxue.java_147.list.RemoveFromListTest.removeThrowException(RemoveFromListTest.java:24)
removeIf
建立一個 ArrayList ,內有三個元素,移除條件相符合的元素。
@Test
public void removeIf() {
int expectedSize = 2;
List<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
list.add("Cherry");
list.removeIf("Apple"::equals);
System.out.println(list);
assertEquals(expectedSize, list.size());
}
[Banana, Cherry]
removeIfEquals
建立一個 ArrayList ,內有三個元素,移除條件相符合的元素。
@Test
public void removeIfEquals() {
int expectedSize = 1;
List<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
list.add("Cherry");
list.removeIf(e -> e.equals("Apple") || e.equals("Cherry"));
System.out.println(list);
assertEquals(expectedSize, list.size());
}
[Banana]
removeIfPredicate
建立一個 ArrayList ,內有三個元素,單獨定義過濾條件,移除條件相符合的元素。
@Test
public void removeIfPredicate() {
int expectedSize = 1;
List<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
list.add("Cherry");
Predicate<String> predicate = v -> v.equals("Apple") || v.equals("Cherry");
list.removeIf(predicate);
System.out.println(list);
assertEquals(expectedSize, list.size());
}
[Banana]
remove
建立一個 ArrayList ,內有三個元素,把條件相符合的元素放入新的 List ,然後新的 List 迴圈內,移除舊的 List 條件相符合的元素。
@Test
public void remove() {
int expectedSize = 2;
List<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
list.add("Cherry");
List<String> willRemove = new ArrayList<>();
for (String e : list) {
if ("Apple".equals(e)) {
willRemove.add(e);
}
}
for (String e : willRemove) {
list.remove(e);
}
System.out.println(list);
assertEquals(expectedSize, list.size());
}
[Banana, Cherry]
iteratorRemove
建立一個 ArrayList ,內有三個元素,使用 iterator,在迴圈內移除條件相符合的元素。
@Test
public void iteratorRemove() {
int expectedSize = 2;
List<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
list.add("Cherry");
ListIterator<String> it = list.listIterator();
while(it.hasNext()){
String e = it.next();
if("Apple".equals(e)){
it.remove();
}
}
System.out.println(list);
assertEquals(expectedSize, list.size());
}
[Banana, Cherry]
filterCollect
建立一個 ArrayList ,內有三個元素,把條件相符合的元素,建立一個新的 List 。
@Test
public void filterCollect() {
int expectedSize = 2;
List<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
list.add("Cherry");
List<String> result = new ArrayList<>();
for (String e : list) {
if (!"Apple".equals(e)) {
result.add(e);
}
}
System.out.println(result);
assertEquals(expectedSize, result.size());
}
[Banana, Cherry]
streamCollect
建立一個 ArrayList ,內有三個元素,使用 stream ,把條件相符合的元素,建立一個新的 List 。
@Test
public void streamCollect() {
int expectedSize = 2;
List<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
list.add("Cherry");
List<String> result = list.stream().filter(e -> !"Apple".equals(e)).collect(Collectors.toList());
System.out.println(result);
assertEquals(expectedSize, result.size());
}
[Banana, Cherry]
RemoveItemsFromListTest.java
Remove Elements from ArrayList 新增單元測試,驗證是否符合預期。
package org.ruoxue.java_147.list;
import static org.junit.Assert.*;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import java.util.ConcurrentModificationException;
import java.util.Iterator;
import org.junit.Test;
public class RemoveItemsFromListTest {
public RemoveItemsFromListTest() {
}
@Test(expected = ConcurrentModificationException.class)
public void removeThrowException() {
int expectedSize = 2;
List<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
list.add("Cherry");
for (String e : list) {
if ("Apple".equals(e)) {
list.remove(e);
}
}
System.out.println(list);
assertEquals(expectedSize, list.size());
}
@Test
public void removeIf() {
int expectedSize = 2;
List<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
list.add("Cherry");
list.removeIf("Apple"::equals);
System.out.println(list);
assertEquals(expectedSize, list.size());
}
@Test
public void removeIfEquals() {
int expectedSize = 1;
List<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
list.add("Cherry");
list.removeIf(e -> e.equals("Apple") || e.equals("Cherry"));
System.out.println(list);
assertEquals(expectedSize, list.size());
}
@Test
public void removeIfPredicate() {
int expectedSize = 1;
List<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
list.add("Cherry");
Predicate<String> predicate = v -> v.equals("Apple") || v.equals("Cherry");
list.removeIf(predicate);
System.out.println(list);
assertEquals(expectedSize, list.size());
}
@Test
public void remove() {
int expectedSize = 2;
List<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
list.add("Cherry");
List<String> willRemove = new ArrayList<>();
for (String e : list) {
if ("Apple".equals(e)) {
willRemove.add(e);
}
}
for (String e : willRemove) {
list.remove(e);
}
System.out.println(list);
assertEquals(expectedSize, list.size());
}
@Test
public void iteratorRemove() {
int expectedSize = 2;
List<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
list.add("Cherry");
Iterator<String> it = list.iterator();
while (it.hasNext()) {
String e = it.next();
if ("Apple".equals(e)) {
it.remove();
}
}
System.out.println(list);
assertEquals(expectedSize, list.size());
}
@Test
public void filterCollect() {
int expectedSize = 2;
List<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
list.add("Cherry");
List<String> result = new ArrayList<>();
for (String e : list) {
if (!"Apple".equals(e)) {
result.add(e);
}
}
System.out.println(result);
assertEquals(expectedSize, result.size());
}
@Test
public void streamCollect() {
int expectedSize = 2;
List<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
list.add("Cherry");
List<String> result = list.stream().filter(e -> !"Apple".equals(e)).collect(Collectors.toList());
System.out.println(result);
assertEquals(expectedSize, result.size());
}
}
心得分享
Remove Elements from ArrayList 提供了幾種 ArrayList 移除元素方法的操作範例,可以刪除元素或是重新產生一個新的 List ,完成 Remove Items from a List 刪除元素的需求。