集合输出
这是我参与8月更文挑战的第20天,活动详情查看:8月更文挑战
在类框架中的对于集合的标准输出为:Iterator
、ListIterator
、Enumeration
、foreach
;
Iterator迭代输出:
迭代输出:依次判断每个元素,判断其是否有内容,如果有内容就输出。
Iterator接口依靠Iterable接口中的iterate()方法实例化的;
Iterator常用方法:
boolean |
hasNext() |
Returns true if the iteration has more elements. |
---|---|---|
E |
next() |
返回迭代中的下一个元素。 |
default void |
remove() |
从基础集合中移除该迭代器返回的最后一个元素(可选操作)。 |
boolean |
hasNext() |
如果迭代有更多元素则返回true。 |
实例:
package Java从入门到项目实战.Java类集框架.集合输出;
import java.util.Iterator;
import java.util.Set;
public class Iterator输出Set集合 {
public static void main(String[] args) {
Set<String> all = Set.of("Hello","World","xbhog");
Iterator<String> iter = all.iterator();
while(iter.hasNext()){
String str = iter.next();
System.out.print(str+"、");
}
}
}
复制代码
关于数据删除的问题:
在Collection中与Iterator都有remove方法;那么应该选择什么呢:
Collection特点:
- 不管三七二十一,就给你删除了,这样会造成
Java.util.ConcurrentModificationException
错误;
Iterator特点:
- 在迭代的时候,都会需要依据存储的数据内容进行判断;所以只有Iterator接口中的remove才是实现删除数据的正确方法。
如:
package cn.mldn.demo;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class JavaCollectDemo {
public static void main(String[] args) {
// 如果使用Set.of()或List.of()创建的集合不支持删除操作
Set<String> all = new HashSet<String>();
all.add("小白"); // 保存数据
all.add("Java"); // 保存数据
all.add("Java"); // 保存重复数据
all.add("xbhog"); // 保存数据
Iterator<String> iter = all.iterator();
while (iter.hasNext()) { // 集合是否有数据
String str = iter.next(); // 获取数据
if ("Java".equals(str)) {
iter.remove() ; // 删除当前数据
} else {
System.out.print(str + "、");
}
}
}
}
复制代码
ListIterator双向迭代:
首先区别Iterator的作用:
Iterator完成的是从前向后单向输出
ListIterator完成的是从后向前输出
但是只有实现Iterator从前向后的输出后才能实现ListIterator从后向前的输出(注意先后顺序);
因为只有实现从前向后输出结束后,指针才执行最后;
如果顺序相反则会输出为空。
其下的扩充方法:
Modifier and Type | Method | Description |
---|---|---|
boolean |
hasPrevious() |
如果该列表迭代器在反向遍历列表时拥有更多元素,则返回true。 |
E |
previous() |
返回列表中的前一个元素,并向后移动光标位置。 |
实例:执行双向迭代
package Java从入门到项目实战.Java类集框架.集合输出;
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
public class 双向迭代输出ListIterator {
public static void main(String[] args) {
List<String> all = new ArrayList<String>();
all.add("小李");
all.add("小宋");
all.add("xbhog");
ListIterator<String> iter = all.listIterator();
System.out.println("执行从后往前的操作的话必须需要先执行从前往后的操作,这样才能是指针指向后面");
//如果不按照相关操作进行,则从后往前的操作输出为空;
System.out.println("从前往后输出:-----------");
while(iter.hasNext()){
System.out.println(iter.next());
}
System.out.println("从后往前输出:------------");
while(iter.hasPrevious()){ //判断是否有前一个元素
System.out.println(iter.previous()); //有的输出前一个元素
}
}
}
复制代码
ListIterator接口实现了List集合的双向迭代操作。
Enumeration枚举输出:
该类型的输出是建立在Vector集合上的;相当于依附产品;
其接口常用方法:
Modifier and Type | Method | Description |
---|---|---|
boolean |
hasMoreElements() |
测试此枚举是否包含更多元素。 |
E |
nextElement() |
如果该枚举对象至少还有一个要提供的元素,则返回该枚举的下一个元素。 |
实例:输出vector集合数据
package cn.mldn.demo;
import java.util.Enumeration;
import java.util.Vector;
public class JavaCollectDemo {
public static void main(String[] args) {
Vector<String> all = new Vector<String>(); // 实例化Vector
all.add("小黄"); // 保存数据
all.add("Java"); // 保存数据
all.add("xbhog"); // 保存数据
Enumeration<String> enu = all.elements() ; // 获取Enumeration实例
while (enu.hasMoreElements()) {
String str = enu.nextElement() ;
System.out.print(str + "、");
}
}
}
复制代码
注意Enumeration只有输出操作没有删除操作。
foreach输出:
没啥好说的,既可以实现数组输出外,也支持集合的输出;
package cn.mldn.demo;
import java.util.HashSet;
import java.util.Set;
public class JavaCollectDemo {
public static void main(String[] args) {
Set<String> all = new HashSet<String>(); // 实例化Set
all.add("小黄"); // 保存数据
all.add("Java"); // 保存数据
all.add("xbhog"); // 保存数据
for (String str : all) {
System.out.print(str + "、");
}
}
}
复制代码
实现自定义foreach输出:
首先需要知道实现foreach需要Iterator接口的支持;所以在Set与List集合才可以通过foreach实现输出;
如果我们自己要实现自定义类的输出,那么我们就需要实例化Iterable接口完成iterator的功能;
package cn.mldn.demo;
import java.util.Iterator;
class Message implements Iterable<String> {// 支持foreach输出
private String[] content = { "Java", "Python", "Ubuntu" }; // 信息内容
private int foot; // 操作脚标
@Override
public Iterator<String> iterator() { // 获取Iterator实例
return new MessageIterator();
}
private class MessageIterator implements Iterator<String> {
@Override
public boolean hasNext() { // 判断是否存在内容
return Message.this.foot <
Message.this.content.length;
}
@Override
public String next() { // 获取数据
return Message.this.content[Message.this.foot++];
}
}
}
public class JavaCollectDemo {
public static void main(String[] args) {
Message message = new Message(); // Iterable接口实例
for (String msg : message) { // foreach输出
System.out.print(msg + "、");
}
}
}
复制代码
结束:
如果你看到这里或者正好对你有所帮助,希望能点个?或者★,感谢;
有错误的地方,欢迎在评论指出,作者看到会进行修改。