Java集合之集合输出的4中方法

707 阅读4分钟

集合输出

这是我参与8月更文挑战的第20天,活动详情查看:8月更文挑战

在类框架中的对于集合的标准输出为:IteratorListIteratorEnumerationforeach;

Iterator迭代输出:

迭代输出:依次判断每个元素,判断其是否有内容,如果有内容就输出。

Iterator接口依靠Iterable接口中的iterate()方法实例化的;

Iterator常用方法:

booleanhasNext()Returns true if the iteration has more elements.
Enext()返回迭代中的下一个元素。
default voidremove()从基础集合中移除该迭代器返回的最后一个元素(可选操作)。
booleanhasNext()如果迭代有更多元素则返回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 TypeMethodDescription
booleanhasPrevious()如果该列表迭代器在反向遍历列表时拥有更多元素,则返回true。
Eprevious()返回列表中的前一个元素,并向后移动光标位置。

实例:执行双向迭代

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 TypeMethodDescription
booleanhasMoreElements()测试此枚举是否包含更多元素。
EnextElement()如果该枚举对象至少还有一个要提供的元素,则返回该枚举的下一个元素。

实例:输出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 + "、");
		}
	}
}

结束:

如果你看到这里或者正好对你有所帮助,希望能点个👍或者★,感谢;

有错误的地方,欢迎在评论指出,作者看到会进行修改。