Java核心类库——集合的迭代(遍历) Iterator接口
集合的迭代(遍历)
使用于:List,Set
集合的迭代,是一种遍历算法
1) 迭代操作举例:播放列表的“逐个播放”;将扑克牌“逐一发放“
2) java使用Iterator接口描述了迭代模式操作
Itertator中的方法,专门为while循环设计
3)Iterator的实例可以从集合对象获得,是这个集合的一个元素序列视图,默认包含一个操作游标(在第一个元素之前)
* hasNext()方法,可以检查游标是否有下一个元素
* next()方法,移动游标到下一个元素,并且返回这个元素引用
使用while循环配合这两个方法,可以迭代处理集合所有的元素
4)迭代时可以使用迭代起remove()方法删除刚刚迭代的元素在迭代过程中
*迭代时不能用使用集合方法(add,remove,set)更改集合元素
例子
1 import java.util.ArrayList; 2 import java.util.Iterator; 3 import java.util.List; 4 5 public class IteratorDemo { 6 public static void main(String[] args) { 7 List<String> eggs = new ArrayList<String>(); 8 eggs.add("鸡蛋"); 9 eggs.add("坏蛋"); 10 eggs.add("鸭蛋"); 11 eggs.add("鹅蛋"); 12 eggs.add("傻蛋"); 13 Iterator ite = eggs.iterator(); 14 while(ite.hasNext()){//hasNext()方法返回一个bollean类型的值,判断是否有下一个 15 String str = ite.next();//ite.next()访问下一个元素 16 System.out.println(str); 17 ite.remove();//删除已经访问过的元素 18 } 19 }
Map的迭代(遍历)
三种遍历方式
A 对Key:value 进行迭代
map.entrySet();
*利用key:value对(Entry)的迭代输出结果
*Entry 接口在Map接口中定义,代表Map集合中的条目
*Map集合可以看作是Entry组成的集合
*使用map.entrySet()方法返回所有Entry组成的Set集合
*每个元素的类型是Entry
Set<Entry<Character,Integer>> entrySet = map.entrySet(); for(Iterator<Entry<Character,Integer>> i=entrySet.iterator();i.hasNext();){ Entry<Character,Integer> entry = i.next(); Character ch = entry.getKey(); Integer n = entry.getValue(); }
B 对Key进行迭代
map.keySet();
*map中的Key是不重复,无序的集合,所以map.keySet()
*返回了Set类型的集合
Set<Character> keys = map.keySet();//全部Key Iterator<Character> its = keys.iterator() while(its.hasNext()){ char ch = its.next() ; System.out.println(ch);//打印出所有的Key }
C 对Value进行迭代
map.values();
*map.values() 返回map中所有Value,组成一个集合
*这个集合的值可能有重复,并且无序,所以是Collection类型
Collection<Integer> values = map.values(); for(Iterator<Integer> its = values.iterator(); its.hasNext();){ int n = its.next(); System.out.println(n);//打印出所有的value }
案例:统计每个字符出现的次数
String s = "aabcbca";
统计结果
a:3 k:v
b:2
c:2
例子:
1 import java.util.ArrayList; 2 import java.util.Collection; 3 import java.util.Collections; 4 import java.util.Comparator; 5 import java.util.HashMap; 6 import java.util.Iterator; 7 import java.util.List; 8 import java.util.Map; 9 import java.util.Map.Entry; 10 import java.util.Set; 11 12 public class CharConuterDemo { 13 public static void main(String[] args) { 14 Map<Character,Integer> map = countAll("abccacedbba"); 15 System.out.println(map); 16 17 System.out.println("迭代Map的Values 实现统计字符总数:"); 18 //map.values() 返回map中所有Value,组成一个集合 19 //这个集合的值可能有重复,并且无序,所以是Collection类型 20 Collection<Integer> values = map.values(); 21 int all = 0; 22 for(Iterator<Integer> its = values.iterator(); its.hasNext();){ 23 int n = its.next(); 24 all+=n; 25 } 26 System.out.println("总字符数:"+all); 27 28 Set<Character> keys = map.keySet();//全部Key 29 //map中的Key是不重复,无序的集合,所以map.keySet() 30 //返回了Set类型的集合, 31 for(Iterator<Character> its = keys.iterator();its.hasNext();){ 32 char ch = its.next() ; 33 int n = map.get(ch); 34 System.out.println(ch + ":" + n 35 + "占总数的" + ((double)n/all)*100); 36 } 37 //利用key:value对(Entry)的迭代输出结果 38 //在迭代之前,要先排序,再迭代输出 39 System.out.println("利用key:value对(Entry)迭代输出"); 40 //Entry 接口在Map接口中定义,代表Map集合中的条目 41 //Map集合可以看作是Entry组成的集合 42 //使用map.entrySet()方法返回所有Entry组成的Set集合 43 //每个元素的类型是Entry 44 Set<Entry<Character,Integer>> entrySet = map.entrySet(); 45 List<Entry<Character,Integer>> list = 46 new ArrayList<Entry<Character,Integer>>(entrySet); 47 Collections.sort(list,new ByValue()); 48 for(Iterator<Entry<Character,Integer>> i=list.iterator();i.hasNext();){ 49 Entry<Character,Integer> entry = i.next(); 50 Character ch = entry.getKey(); 51 Integer n = entry.getValue(); 52 } 53 } 54 /** 55 * 统计字符串中每个字符的数量 56 * @param str一个被统计的字符串 57 * @return 一个统计的结果Map集合,其中Key是字符,value是出现次数 58 * str = "aabccbea"; 59 * 60 */ 61 public static Map<Character,Integer> countAll(String str){ 62 //创建一个空map统计结果 63 HashMap<Character,Integer> map = 64 new HashMap<Character,Integer>(); 65 //迭代字符串的每个字符, 66 for(int i=0;i<str.length();i++){ 67 char ch = str.charAt(i); 68 //检查map中是否包含这个字符 69 if(map.containsKey(ch)){ 70 //如果包含(统计过),取出原统计值并对其+1,保存回map 71 Integer n = map.get(ch); 72 map.put(ch, n+1); 73 }else{ 74 //如果没有包含,就添加新的统计结果为 1 75 map.put(ch, 1); 76 } 77 } 78 return map; 79 } 80 81 } 82 class ByValue implements Comparator<Entry<Character,Integer>>{ 83 public int compare(Entry<Character,Integer> o1,Entry<Character,Integer> o2){ 84 return -(o1.getValue() - o2.getValue()); 85 } 86 } 87 88 89 90 sort()和Comparator之间不可告人的排序秘密 91 92 例子:按照字符串数组长度排序 93 常用写法(使用匿名类) 94 import java.util.ArrayList; 95 import java.util.Collections; 96 import java.util.Comparator; 97 import java.util.List; 98 99 public class ComparatorDemo { 100 public static void main(String[] args) { 101 List<String> list= new ArrayList<String>(); 102 list.add("Tom"); 103 list.add("Jerry"); 104 list.add("Andy"); 105 Collections.sort(list, new Comparator<String>(){ 106 public int compare(String o1,String o2){ 107 return o1.length()-o2.length(); //按照字符串长度排序 108 } 109 }); 110 System.out.println(list); 111 } 112 113 }
例子2部分代码,按Value的大小排序
1 List<Entry<Character,Integer>> list = 2 new ArrayList<Entry<Character,Integer>>(); 3 Collections.sort(list,new ByValue()); 4 //普通写法(未使用匿名类) 5 class ByValue implements Comparator<Entry<Character,Integer>>{ 6 public int compare(Entry<Character,Integer> o1,Entry<Character,Integer> o2){ 7 //return (o1.getValue() - o2.getValue());//从小到大 8 return -(o1.getValue() - o2.getValue());//从大到小 9 } 10 }