一、深入了解遍历器(Iterator)
1、遍历器接口有三个方法
1)、boolean hasNext()------>判断是否有下一个元素;
2)、E next()-----> 返回当前游标(cursor)所指向的值,并且将游标指向下一个元素;
3)、void remove------>移除当前游标所在的位置的元素。
2、自定义遍历器
import java.util.ArrayList;
/**
* 目标:深入迭代器的原理。一个容器可以创建多个迭代器对象
* 使用了匿名类,内部类
*/
import java.util.Iterator;
import java.util.List;
public class DeepSimpleList implements java.lang.Iterable {
private String[] elem = new String[5];
private int size = 0;
public int size(){
return size;
}
public void add(String s){
if(size == elem.length){
String[] newElem = new String[elem.length*2];
System.arraycopy(elem, 0, newElem, 0, size);
elem = newElem;
}
elem[size] = s;
size++;
}
public Iterator iterator(){
return new Iterator(){
private int cursor = -1;
public boolean hasNext(){
return cursor+1 < size ;
}
public String next(){ //将游标移到下一个位置并且返回游标当前的值
cursor++;
return elem[cursor];
}
public void remove(){
System.arraycopy(elem, cursor+1, elem, cursor, DeepSimpleList.this.size-(cursor+1));
size--;
cursor--;
}
};
}
public Iterator iterator2(){
class MyIter implements Iterator{
private int cursor = -1;
public boolean hasNext(){
return cursor+1 < size ;
}
public String next(){ //将游标移到下一个位置并且返回游标当前的值
cursor++;
return elem[cursor];
}
public void remove(){
System.arraycopy(elem, cursor+1, elem, cursor, DeepSimpleList.this.size-(cursor+1));
size--;
cursor--;
}
}
return new MyIter();
}
public static void main(String[] args) {
DeepSimpleList list = new DeepSimpleList();
list.add("a");
list.add("b");
list.add("c1");
list.add("c2");
list.add("c3");
list.add("c4");
list.add("c5");
list.add("c6");
Iterator iter = list.iterator();
while(iter.hasNext()){// 先判断后获取
System.out.println(iter.next());
}
System.out.println("---------------");
for(Object s:list){
System.out.println(s);
}
System.out.println(list.size());
}
}
二、分拣存储
1.什么是分拣存储?
map存放的是键值对,根据键对象来查找值对象,键对象不能重复(如果重复,后面的值会覆盖前面键所对应的值对象),那么我们有时候会需要用之前被覆盖的值对象。这就会涉及到分拣存储。
下面一个例子来说明分拣存储:
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
/**
* 分拣存储:1:N
* 统计每个单词出现的个数
* this is a cat and that is a mice and where is the food ?
*
* 思路
* 1.分割字符串;
* 2.分拣存储
* 3.按要求查看 单词出现的次数
*
* @author liuming
*
*/
public class MapDemo01 {
public static void main(String[] args) {
//1.分割字符串
String[] arr = "this is a cat and that is a mice and where is the food ?".split(" ");
//2.分拣存储
Map<String,Integer> map = new HashMap<String,Integer>();
/*for(String key:arr){
if(!map.containsKey(key)){
map.put(key, 1);
}else{
map.put(key, map.get(key)+1);
}
}*/
for(String key:arr){
Integer value = map.get(key);
if(value==null){
map.put(key, 1);
}else{
map.put(key, map.get(key)+1);
}
}
//3.查看单词出现的次数
Set<String> keySet = map.keySet();
Iterator<String> iter = keySet.iterator();
while(iter.hasNext()){
String key = iter.next();
Integer value = map.get(key);
System.out.println(key+"-->"+value);
}
}
}
2、涉及到一些方法的使用
1)、Set <K> keySet(); 返回map中键的set视图
2)、split---->字符串分隔符。将一个字符串按照分隔符分割为字符串数组。
stringObj.split([separator,[limit]])
stringObj
必选项。要被分解的 String 对象或文字,该对象不会被split方法修改。
separator
可选项。字符串或正则表达式对象,它标识了分隔字符串时使用的是一个还是多个字符。如果忽略该选项,返回包含整个字符串的单一元素数组。
limit
可选项。该值用来限制返回数组中的元素个数(也就是最多分割成几个数组元素,只有为正数时有影响)
split 方法的结果是一个字符串数组,在 stingObj 中每个出现 separator 的位置都要进行分解。separator不作为任何数组元素的部分返回。
示例1:
String str="Java string split test";
String[] strarray=str.split(" ");
for (int i = 0; i < strarray.length; i++)
System.out.println(strarray[i]);
将输出:
Java
string
split
test
示例2:
String str="Java string split test";
String[] strarray=str.split(" ",2);//使用limit,最多分割成2个字符串
for (int i = 0; i < strarray.length; i++)
System.out.println(strarray[i]);
将输出:
Java
string split test
本文详细介绍了Java中的迭代器接口,包括其三个主要方法:hasNext、next和remove。还展示了如何自定义遍历器,并通过DeepSimpleList类实现。此外,文章讨论了分拣存储的概念,通过一个例子展示了如何统计字符串中单词出现的次数,并介绍了Map的keySet方法以及字符串的split方法。
1086

被折叠的 条评论
为什么被折叠?



