`
smartvessel
  • 浏览: 80709 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

tomcat 7 源码分析-12 Enumeration枚举

阅读更多

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();
	}

}
 
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics