一、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);
}
}
}
}