Java集合遍历删除指定元素是指在使用集合时,通过遍历集合中的元素,找到满足条件的元素,然后将其从集合中删除。
Java集合遍历删除指定元素的方法有很多,下面以ArrayList为例,介绍一种常用的方法。
// 定义一个ArrayList ArrayList<String> list = new ArrayList<String>(); list.add("a"); list.add("b"); list.add("c"); list.add("d"); list.add("e"); // 遍历ArrayList,如果当前元素是“c”,就将其从集合中删除 for (int i = 0; i < list.size(); i++) { if (list.get(i).equals("c")) { list.remove(i); // 将当前位置的元素删除 } // 注意此处不能使用break语句,因为remove()之后会对数组进行重新排序 // 所以必须要将数组中所有的“c”都删除才行 } System.out.println(list); // 输出[a, b, d, e]
在Java Collections Framework中,不同类型的集合使用不同类型的数据结构以不同的方式存储它们的元素。
一些集合对它们的元素有排序,有些没有。集合框架提供了遍历集合的以下方法:
集合提供了一个迭代器来遍历其所有元素。
迭代器可以对集合执行以下三个操作:
Java中的迭代器是 Iterator< E>
接口的一个实例。
我们可以使用Collection接口中的iterator()方法获取集合的迭代器。
以下代码创建一个字符串列表,并获取列表的迭代器:
import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class Main { public static void main(String[] args) { // Create a list of strings List<String> names = new ArrayList<>(); // Get an iterator for the list Iterator<String> nameIterator = names.iterator(); } }
迭代器< E> 接口包含以下方法:
boolean hasNext() E next() default void remove() default void forEachRemaining(Consumer<? super E> action)
如果集合中有更多元素要迭代, hasNext()
方法将返回true。否则,它返回false。
next()
方法返回集合中的下一个元素。我们应该在调用 next()
方法之前调用 hasNext()
方法。如果没有, next()
方法会抛出NoSuchElementException异常。
通常, hasNext()
和 next()
方法在循环中一起使用。以下代码使用迭代器打印列表的所有元素:
import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class Main { public static void main(String[] args) { // Create a list of strings List<String> names = new ArrayList<>(); names.add("A"); names.add("B"); names.add("C"); // Get an iterator for the list Iterator<String> nameIterator = names.iterator(); // Iterate over all elements in the list while (nameIterator.hasNext()) { // Get the next element from the list String name = nameIterator.next(); System.out.println(name); } } }
上面的代码生成以下结果。
remove()
方法删除 next()
方法最后返回的元素。每次调用next()方法只能调用一次 remove()
方法。
如果对于每个 next()
方法或在第一次调用next()之前被多次调用 remove()
方法,它会抛出一个 IllegalStateException
异常。
对 remove()
方法的支持是可选的。remove()
方法可能会抛出一个 UnsupportedOperationException
异常。
以下代码使用迭代器遍历列表的所有元素,并使用remove()方法删除该元素。
import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class Main { public static void main(String[] args) { // Create a list of strings List<String> names = new ArrayList<>(); names.add("A"); names.add("B"); names.add("C"); Iterator<String> nameIterator = names.iterator(); // Iterate over all elements in the list while (nameIterator.hasNext()) { // Get the next element from the list String name = nameIterator.next(); System.out.println(name); nameIterator.remove(); } System.out.println(names); } }
上面的代码生成以下结果。
forEachRemaining()方法对集合中尚未由迭代器访问的每个元素执行操作。
action指定为 Consumer
。
以下代码显示如何打印列表的所有元素。
import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class Main { public static void main(String[] args) { // Create a list of strings List<String> names = new ArrayList<>(); names.add("A"); names.add("B"); names.add("C"); Iterator<String> nameIterator = names.iterator(); nameIterator.forEachRemaining(System.out::println); } }
上面的代码生成以下结果。
迭代器是一次性对象。我们不能重置迭代器,它不能被重用。
要再次遍历同一集合的元素,请通过调用集合的iterator()方法来创建一个新的Iterator。
我们可以使用for-each循环遍历集合的元素。
我们可以使用for-each循环遍历任何实现类实现Iterable接口的集合。
for-each循环的一般语法如下:
Collection<T> yourCollection = ; for(T element : yourCollection) { }
在幕后,for-each循环获取迭代器并调用hasNext()和next()方法。
import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { // Create a list of strings List<String> names = new ArrayList<>(); names.add("A"); names.add("B"); names.add("C"); for (String name : names) { System.out.println(name); } } }
上面的代码生成以下结果。
for-each循环有几个限制。
我们不能使用for-each循环从集合中删除元素。
以下代码将抛出ConcurrentModificationException异常:
List<String> names = get a list; for(String name : names) { names.remove(name);// Throws a ConcurrentModificationException }
对于for-each循环,我们没有办法从集合的中间开始。
for-each循环不提供访问先前访问的元素的方式。
Iterable接口包含一个新的 forEach(Consumer action)
方法。
该方法遍历所有元素并应用操作。
forEach()
方法在从 Collection
接口继承的所有集合类型中都可用。
import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { // Create a list of strings List<String> names = new ArrayList<>(); names.add("A"); names.add("B"); names.add("C"); names.forEach(System.out::println); } }
上面的代码生成以下结果。
Java 实例 - 在指定目录中查找文件 Java 实例以下实例演示了使用 File 类的 dir.list() 方法在指定目录中查找所有文件列表:impo...
Java设计模式 - 观察者模式观察者模式用于在一个对象被修改时通知其相关对象。观察者模式是一种行为模式类别。例子import java.u...
Java设计模式 - 代理模式在代理模式中,一个类代表另一个类的功能。代理模式是一种结构模式。在代理模式中,我们创建具有原始接...
Java设计模式 - 工厂模式工厂模式是一种创建模式,因为此模式提供了更好的方法来创建对象。在工厂模式中,我们创建对象而不将创...
Java面向对象设计 - Java导入导入声明用于将任何类型导入编译单元。导入声明出现在包声明之后,第一个类型声明之前。有两种类型...