Enumeration枚举,就是要把内容没有重复的遍历,而且不破坏原有的存储空间。在http headers的实现中,tomcat实现了一些枚举类。
Enumerate the distinct header names. Each nextElement() is O(n)
class NamesEnumerator implements Enumeration<String> {
int pos;
int size;
String next;
MimeHeaders headers;
public NamesEnumerator(MimeHeaders headers) {
this.headers=headers;
pos=0;
size = headers.size();
findNext();
}
private void findNext() {
next=null;
for( ; pos< size; pos++ ) {
next=headers.getName( pos ).toString();
for( int j=0; j<pos ; j++ ) {
if( headers.getName( j ).equalsIgnoreCase( next )) {
// duplicate.
next=null;
break;
}
}
if( next!=null ) {
// it's not a duplicate
break;
}
}
// next time findNext is called it will try the
// next element
pos++;
}
public boolean hasMoreElements() {
return next!=null;
}
public String nextElement() {
String current=next;
findNext();
return current;
}
}
Enumeration的核心是findNext函数,实现了找到下一个元素的功能,保障与之前的不重复。
简单分析findNext的算法:
pos就表示next的位置,如果在循环pos前面的元素时,发现有重复的,就把next=null,跳出循环后,判断是否为null。
如果next为null,外边的循环仍然继续,pos后移,此举就是跳出有重复的元素。
如果next不等于null,说明此pos的元素与之前不重复,next即是下一个元素。整个循环结束。
最后pos++,为下一个next做准备。
类似的写了个队char的枚举类,验证了下算法
package com.test.Enumerator;
import java.util.Enumeration;
public class CharEnumeration implements Enumeration<Character> {
Character next;
Character characters[];
int pos;
int size;
CharEnumeration(Character a[]) {
characters = a;
size = a.length;
pos = 0;
findNext();
}
@Override
public boolean hasMoreElements() {
// TODO Auto-generated method stub
return next != null;
}
private void findNext() {
next = null;
for (; pos < size; pos++) {
next = characters[pos];
for (int i = 0; i < pos; i++) {
if (next == characters[i]) {
next = null;
break;
}
}
if (next != null)
break;
}
pos++;
}
@Override
public Character nextElement() {
// TODO Auto-generated method stub
Character cur = next;
findNext();
return cur;
}
public void PrintAll() {
while (hasMoreElements()) {
System.out.println(nextElement());
}
}
}
package com.test.Enumerator;
public class EnumeratorTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Character [] sample = {'a','b','c','d','e','a','a','b'};
CharEnumeration che = new CharEnumeration(sample);
che.PrintAll();
}
}