Java Remove Items From List - Java 147

Java Remove Items From List – Java 147

Java 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 刪除元素的需求。

發佈留言