java学习之Map集合的两种遍历方法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33322074/article/details/87203685

一、Map集合有哪些遍历方法?

Map集合是以键值对的方式存储数据的,Map集合的遍历因此不像数组一样直接进行遍历。java的开发者提供了两种方式对Map集合进行遍历操作。一种是KeySet方式,另一种是EntrySet方式。

二、EntrySet方式遍历Map集合

1、首先要创建一个Map集合

Map<String,Integer> map=new HashMap<String,Integer>();

泛型里的类型可以替换成其他类型。

2、往Map集合中添加值,用put()方法

map.put(str,inte);

3、用entrySet()方法将Map集合放到Set集合中

Map集合没有遍历方法只有放到Set集合中才能遍历

Set<Entry<String,Integer>> entrySet=map.entrySet();

4、对Set集合进行遍历

对Set集合遍历有两种遍历方式,一种是增强for循环遍历方式,另一种是迭代器遍历方式。

增强for循环遍历:

for(所遍历集合的类型 变量:所遍历集合){
}
for(Entry<String,Integer> entry:entrySet) {
			String key=entry.getKey();//获取键
			Integer value=entry.getValue();//获取值
			System.out.println(key+"的类型文件有"+value);
		}

迭代器遍历:

首先要创建一个迭代器:

Iterator<Entry<String,Integer>> entrySetIt=entrySet.iterator();

注意:迭代器也是通过entrySet集合调用后做的,即:迭代器是Map集合调用entrySet()方法将map集合存储到Set集合后做的。

然后:需要通过while循环

while(entrySetIt.hasNext()) {//通过while循环判断是否还有下一个值
		Entry<String,Integer> entryit=entrySetIt.next();//将next的获取的值放入Entry<>集合中
		String key1=entryit.getKey();//获取键
		Integer value1=entryit.getValue();//获取值
		System.out.println(key1+"的类型文件有"+value1);//打印
	}

因此使用EntrySet()方法遍历Map集合就完成了。

三、使用KeySet()方法比遍历Map集合

1、调用keySet()方法将Map集合的内容存储到Set集合中。

Set<String> keyset=map.keySet();

2、遍历Set集合,可以用增强for循环,也可以用Iterator遍历

增强for:

keySet的遍历方法是通过获取键值对的键放在Set集合中的,而EntrySet()方法是通过获取整个键值对放到Entry<>集合中的。

Set<String> keyset=map.keySet();//获取键放到Set集合中
		for(String key3:keyset) {//遍历键
			Integer value3=map.get(key3);//获取值
			System.out.println(key3+"的类型文件有"+value3);//打印
		}

Iterator的遍历:

Iterator<String> iter=keyset.iterator();//建立迭代器,将获取的集合放到迭代器中
		while(iter.hasNext()) {//while判断是否set集合是否还有值
			String key4=iter.next();//获取键
			Integer value4=map.get(key4);//获取值
			System.out.println(key4+"的类型文件有"+value4);//打印
		}

四、两种遍历方式的区别

1、两种遍历方式的最大区别在于所存储的集合不同:

map调用entrySet()方法,返回的是Entry类型的键值对集合,然后再将整个集合看成一个放入Set<>集合中。然后再使用增强for循环或者Iterator进行遍历。

而keySet()方法返回的是建制对的键,所以直接将键存储到集合Set<>中,然后通过增强for循环或Iterator遍历,注意:此时无论哪种遍历获取值时都是通过map集合中的get()方法获取的。这一点与entrySet()方法很大不同。

五、源码:

package IoFile0213;

import java.io.File;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Scanner;
import java.util.Set;

/*
 * 5.键盘录入一个文件夹路径,统计该文件夹(包含子文件夹)中每种类型的文件及个数,
 * 	注意:用文件类型(后缀名,不包含.(点),如:"java","txt")作为key,
	用个数作为value,放入到map集合中,并用两种方式遍历map集合
	例如:
		doc 的类型的文件有  3 个
		java 的类型的文件有  5 个
		txt 的类型的文件有  7 个
*/
public class CountFileStyle {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println("请输入文件路径:");
		Scanner scan =new Scanner(System.in);
		String str=scan.nextLine();
		File file=new File(str);
		//创建一个Map集合
		Map<String,Integer> map=new HashMap<String,Integer>();
		getFileTypeCount(file,map);
		//遍历map集合
		Set<Entry<String,Integer>> entrySet=map.entrySet();
		System.out.println("迭代器方法遍历:");
		Iterator<Entry<String,Integer>> entrySetIt=entrySet.iterator();
		while(entrySetIt.hasNext()) {
			Entry<String,Integer> entryit=entrySetIt.next();
			String key1=entryit.getKey();
			Integer value1=entryit.getValue();
			System.out.println(key1+"的类型文件有"+value1);
		}
		System.out.println("增强for循环方法遍历:");
		for(Entry<String,Integer> entry:entrySet) {
			String key2=entry.getKey();
			Integer value2=entry.getValue();
			System.out.println(key2+"的类型文件有"+value2);
		}
		System.out.println("这是keySet的增强for循环遍历");
		Set<String> keyset=map.keySet();
		for(String key3:keyset) {
			Integer value3=map.get(key3);
			System.out.println(key3+"的类型文件有"+value3);
		}
		System.out.println("这是keySet的iterator方式遍历");
		Iterator<String> iter=keyset.iterator();
		while(iter.hasNext()) {
			String key4=iter.next();
			Integer value4=map.get(key4);
			System.out.println(key4+"的类型文件有"+value4);
		}
		
		
	}
	public static void getFileTypeCount(File file,Map<String,Integer> map) {
		//将file集合的内容放到数组中
		File[] files=file.listFiles();
		//遍历对象数组
		for(File f:files) {
			if(f.isFile()) {
				int index=f.getName().lastIndexOf(".");
				String str=f.getName().substring(index+1);
				//表示:如果str建的值为空就为1,否则就加1。
				map.put(str,map.get(str)==null?1:map.get(str)+1);		
			}
			else if(f.isDirectory()) {
				getFileTypeCount(f,map);
			}
		}
	}

}

猜你喜欢

转载自blog.csdn.net/qq_33322074/article/details/87203685