迭代器的扩展
- map迭代器
MapIterator 很方便,以后将不再使用map.keyset来用Iterator访问了。
要使用这个map必须要实现IterableMap接口,而commons提供了很好的实现类HashedMap。
public static void hashedMap(){
HashedMap map=new HashedMap<>();
map.put("a", "handsome");
map.put("b", "littleugly");
map.put("c", "coll");
MapIterator it=map.mapIterator();
while(it.hasNext()){
/**
* it.next();
* String key=it.getKey();
* 使用这种迭代有可能会忘记掉it.next造成错误,所以推荐用下面的
*/
String key=it.next();
String value=map.get(key);
System.out.println(key+"----->"+value);
}
}
- 去重迭代器,相当于去除重复的过滤器
用 new UniqueFilterIterator(迭代器);来包装某容器的迭代器
再遍历时,即可去重
public static void uniqueFilterIterator(){
List list=new ArrayList<>();
list.add("a");
list.add("b");
list.add("a");
list.add("c");
//返回一个Iterator
Iterator it=new UniqueFilterIterator(list.iterator());
while(it.hasNext()){
System.out.println(it.next());
}
}
输出结果:
a
b
c
- 自定义规则的迭代器
FilterIterator自定义过滤+Predicate
使用new FilterIterator(迭代器,断言);返回一个迭代器
public static void filterIterator(){
List list=new ArrayList<>();
list.add("Viking");
list.add("and");
list.add("handsome");
list.add("Apple");
list.add("hello");
//字符串带有a则返回false
Predicate predicate=new Predicate() {
public boolean evaluate(String str) {
char c;
for(int i=0;i it=new FilterIterator(list.iterator(),predicate);
while(it.hasNext()){
System.out.println(it.next());
}
}
输出结果:
Viking
Apple
hello
- 循环迭代器
LoopingIterator
使用new LoopingIterator(容器);返回一个迭代器
public static void loopingIterator(){
List list=new ArrayList<>();
list.add("Viking");
list.add("and");
list.add("handsome");
Iterator it=new LoopingIterator(list);
//限定输出的元素个数
for(int i=0;i<5;i++){
System.out.println(it.next());
}
}
输出结果:
Viking
and
handsome
Viking
and
- 数组迭代器
new ArrayListIterator(数组,索引起始,索引终止);
也可以不指定索引
public static void arrayIterator(){
int[] a={1,2,3,4,5,6,7,8,9};
//全部迭代
Iterator it=new ArrayListIterator(a);
while(it.hasNext())
System.out.print(it.next()+"\t");
System.out.println();
//限定索引
Iterator it2=new ArrayListIterator(a,3,8);
while(it2.hasNext())
System.out.print(it2.next()+"\t");
}
输出结果:
1 2 3 4 5 6 7 8 9
4 5 6 7 8
双向Map
跟guava里的biMap类似。
要求键跟值都不能重复,所以可以反转。使用inverseBidiMap();方法
- DualTreeBidiMap(); 有序的
- DualHashBidiMap(); 无序的
有序的,元素放进去的时候就排序了
public static void main(String[] args) {
BidiMap bidimap=new DualTreeBidiMap<>();
bidimap.put("mom", "[email protected]");
bidimap.put("dad", "[email protected]");
bidimap.put("yang", "[email protected]");
bidimap.put("viking", "[email protected]");
MapIterator it=bidimap.mapIterator();
while(it.hasNext()){
String key=it.next();
String value=it.getValue();
System.out.println(key+"------>"+value);
}
//反转后通过值来获得键
System.out.println(bidimap.inverseBidiMap().get("[email protected]"));
}
输出结果:
dad------>[email protected]
mom------>[email protected]
viking------>[email protected]
yang------>[email protected]
dad
无序的就是没排序的,没啥特别的
Bag 包,可以重复
- HashBag 无序
- TreeBag 有序
添加和删除时可以选择次数
add(内容,次数)
remove一样
public static void main(String[] args) {
Bag bag=new HashBag<>();
bag.add("a");
bag.add("a",3);
bag.remove("a",2);
bag.add("b",3);
Iterator it=bag.iterator();
while(it.hasNext())
System.out.print(it.next()+"\t");
}
结果:
a a b b b
利用bag来解决之前的统计字符串数量的问题
public static void main(String[] args) {
String str="this is a cat and that is a mice where is the food";
String[] strs=str.split(" ");
Bag bag=new HashBag<>();
for(int i=0;i set=bag.uniqueSet();
//遍历
for(String temp:set){
System.out.println(temp+"------->"+bag.getCount(temp));//bag.getCount()可以获得该元素的数量
}
}```