Enumeration枚举,就是要把内容没有重复的遍历,而且不破坏原有的存储空间。在http headers的实现中,tomcat实现了一些枚举类。
Enumerate the distinct header names. Each nextElement() is O(n)
Java代码
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;
}
}
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的枚举类,验证了下算法
Java代码
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) {
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;
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) {
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());
}
}
}
CharEnumeration che = new
CharEnumeration(sample);
che.PrintAll();
}
}
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();
}
}