<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Heis的Blog

    保持簡單,保持愚蠢
    隨筆 - 29, 文章 - 1, 評論 - 122, 引用 - 0
    數(shù)據(jù)加載中……

    Jakarta Commons Cookbook讀書筆記--Commons Collections(容器篇之一)

    Jakarta Commons Cookbook讀書筆記系列

    3.5 Iterator的擴(kuò)展


    3.5.1 循環(huán)迭代器LoopingIterator

    import org.apache.commons.collections.iterators.LoopingIterator;

    List books
    =new ArrayList();
            books.add(
    "EnglishBook");
            books.add(
    "Commons Cookbook");
            books.add(
    "Who Moved My Cheese");
            
    //當(dāng)?shù)阶詈蟮脑睾?,再返回第一個元素重新循環(huán),直至達(dá)到迭代次數(shù)為止
            LoopingIterator iterator=new LoopingIterator(books);
            
    for(int i=0;i<5;i++){
                String book
    =(String)iterator.next();
                System.out.print(book
    +";");
            }
    ->EnglishBook;Commons Cookbook;Who Moved My Cheese;EnglishBook;Commons Cookbook;


    3.5.2 ArrayList迭代器ArrayListIterator
    可以自定義范圍地遍歷

    import org.apache.commons.collections.iterators.ArrayListIterator;
     
    String[] arrays
    =new String[]{"a","b","c","d","f"};
            
    //遍歷下標(biāo)為1到4的元素
            Iterator iterator=new ArrayListIterator(arrays,1,4);
            
    while(iterator.hasNext()){
                System.out.print(iterator.next()
    +"");
            }
    ->b; c; d;


    3.5.3 篩選迭代器FilterIterator
    使用Predicate篩選,關(guān)于Predicate的介紹,請看我的這系列的上一篇文章Jakarta Commons Cookbook讀書筆記--Commons Collections(函子篇)

    import org.apache.commons.collections.iterators.FilterIterator;
    import org.apache.commons.collections.Predicate;

    List list
    =new ArrayList(Arrays.asList(new Integer[]{7,9,35,67,88}));
           
            
    //過濾出大于30的元素
            Predicate predicate=new Predicate(){           
                
    public boolean evaluate(Object object){
                    
    int num=((Integer)object).intValue();
                    
    return num>30;
                }
            };
            Iterator iterator
    =new FilterIterator(list.iterator(),predicate);
            
    while(iterator.hasNext()){
                System.out.print(iterator.next()
    +"");
            }
    ->356788;


    3.5.4 過濾重復(fù)的元素UniqueFilterIterator

    List list=new ArrayList(Arrays.asList(new String[]{"a","b","c","b","a"}));
           
            Iterator iterator
    =new UniqueFilterIterator(list.iterator());
            
    while(iterator.hasNext()){
                System.out.print(iterator.next()
    +"");
            }
    ->a; b; c;


    3.6 使用Bag


    Bag是這樣的一種容器,它能夠存儲多個邏輯相等(即equals()為true,而且hash()相等)的元素,并可以統(tǒng)計它們的個數(shù)。


    3.6.1 高性能的HashBag

    import org.apache.commons.collections.bag.HashBag;

    Bag bag1
    =new HashBag();
            bag1.add(
    "book1",10);
            bag1.add(
    "book2",20);
           
            Bag bag2
    =new HashBag();
            bag2.add(
    "book2",5);
            bag2.add(
    "book3",10);
           
            bag1.add(
    "book1");
            bag1.remove(
    "book1",2);   
            
    //減去bag2內(nèi)相應(yīng)元素的數(shù)量
            bag1.removeAll(bag2);
           
            System.out.println(
    "book1: "+bag1.getCount("book1"));
            System.out.println(
    "book2: "+bag1.getCount("book2")+"\n");
           
            
    //bag1保留bag2內(nèi)的元素,簡單來說就是求交集
            bag1.retainAll(bag2);
            System.out.println(
    "book1: "+bag1.getCount("book1"));
            System.out.println(
    "book2: "+bag1.getCount("book2"));
            System.out.println(
    "book3: "+bag1.getCount("book3"));
    ->
    book1: 
    9
    book2: 
    15

    book1: 
    0
    book2: 
    5
    book3: 
    0


    3.6.2 TreeBag可以保存加入元素的順序

    import org.apache.commons.collections.bag.TreeBag;

    Bag bag1
    =new TreeBag();
            bag1.add(
    "book1",2);
            bag1.add(
    "book2",1);
            bag1.add(
    "book3",2);
            bag1.add(
    "book4",1);
            bag1.add(
    "book5",1);
           
            Iterator iterator
    =bag1.iterator();
            
    while(iterator.hasNext()){
                System.out.println(iterator.next());
            }
    ->
    book1
    book1
    book2
    book3
    book3
    book4
    book5


    HashBag內(nèi)部原理是使用一個HashMap當(dāng)作內(nèi)部容器,key為加入的對象,對應(yīng)的value是對象的次數(shù)。同理TreeBag使用TreeMap作為內(nèi)部容器。
    需 要注意的是雖然Bag繼承了Collection,但是它的removeAll(),containsAll(),add(),remove()和 retainAll()方法并不嚴(yán)格遵循Collection接口的規(guī)范。例如removeAll方法根據(jù)規(guī)范是移除所有的元素,而Bag的 removeAll是帶參數(shù)的,只移除參數(shù)包含的元素。

    3.7 用于臨時數(shù)據(jù)轉(zhuǎn)移的Buffer


    Buffer類似于java5.0中的Queue,是個先進(jìn)先出(First-in First-out)的數(shù)據(jù)容器。


    3.7.1 無尺寸緩沖區(qū)UnboundFifoBuffer和有尺寸緩沖區(qū)BoundedFifoBuffer

    import org.apache.commons.collections.buffer.BoundedFifoBuffer;

    Buffer bBuffer
    =new BoundedFifoBuffer(2);
            bBuffer.add(
    "book1");
            bBuffer.add(
    "book2");
            
    try{
                bBuffer.add(
    "book3");
            }
    catch(BufferOverflowException e){
                System.out.println(
    "Buffer is over flow");
            }
            
    //移除第一個加入的元素
            bBuffer.remove();
            Iterator iterator
    =bBuffer.iterator();
            
    while(iterator.hasNext()){
                System.out.println(iterator.next());
            }
    ->
    Buffer is over flow
    book2


    import org.apache.commons.collections.buffer.UnboundedFifoBuffer;

    Buffer bBuffer
    =new UnboundedFifoBuffer(2);
            bBuffer.add(
    "book1");
            bBuffer.add(
    "book2");
            
    try{
                bBuffer.add(
    "book3");
            }
    catch(BufferOverflowException e){
                System.out.println(
    "Buffer is over flow");
            }
            
    //移除第一個加入的元素
            bBuffer.remove();
            Iterator iterator
    =bBuffer.iterator();
            
    while(iterator.hasNext()){
                System.out.println(iterator.next());
            }
    ->
    book2
    book3


    3.7.2 帶優(yōu)先級的緩沖區(qū)PriorityBuffer
    按照數(shù)值從小到大排列

    import org.apache.commons.collections.buffer.PriorityBuffer;

    Buffer pBuffer
    =new PriorityBuffer();
            pBuffer.add(
    new Long(2));
            pBuffer.add(
    new Long(20));
            pBuffer.add(
    new Long(12));
            pBuffer.add(
    new Long(4));
           
            Iterator iterator
    =pBuffer.iterator();
            
    while(iterator.hasNext()){
                System.out.println(iterator.next());
            }
    ->
    2
    4
    12
    20


    PriorityBuffer允許使用Comparator來排列優(yōu)先順序,關(guān)于Comparator,請看我的這系列的上一篇文章Jakarta Commons Cookbook讀書筆記--Commons Collections(函子篇)

    import java.util.Comparator;
    //按照銷售數(shù)量從大到小排列
    public class RecommandComparator implements Comparator {

        
    public int compare(Object o1, Object o2) {
            
    int result=-1;
            
    if(o1 instanceof Book && o2 instanceof Book){
                Book book1
    =(Book)o1;
                Book book2
    =(Book)o2;
               
                result
    =book1.getSalsNum().compareTo(book2.getSalsNum());           
            }
            
    return result;
        }
    }


    import org.apache.commons.collections.comparators.ReverseComparator;
    import org.apache.commons.collections.buffer.PriorityBuffer;

    Buffer pBuffer
    =new PriorityBuffer(new ReverseComparator(new RecommandComparator()));
            pBuffer.add(
    new Book("book1",Long.valueOf(200)));
            pBuffer.add(
    new Book("book2",Long.valueOf(7200)));
            pBuffer.add(
    new Book("book3",Long.valueOf(163)));
            pBuffer.add(
    new Book("book4",Long.valueOf(569)));
           
            Iterator iterator
    =pBuffer.iterator();
            
    while(iterator.hasNext()){
                Book book
    =(Book)iterator.next();
                System.out.println(book.getName()
    +":"+book.getSalsNum());
            }
    ->
    book2:
    7200
    book4:
    569
    book3:
    163
    book1:
    200

    3.7.3 使用阻塞式緩沖區(qū)BlockingBuffer
    BlokingBuffer裝飾一個Buffer實例,并使其處于阻塞狀態(tài),只要有對象加入則馬上處理。當(dāng)一個進(jìn)程調(diào)用以BlockingBuffer的get()和remove()方法時,將不返回任何值,直到它有一個對象返回。

    import org.apache.commons.collections.Buffer;

    public class BufferListener implements Runnable{
        
    private Buffer buffer;
       
        
    public BufferListener(Buffer buffer){
            
    this.buffer=buffer;
        }
       
        
    public void run() {
            
    while(true){
                String msg
    =(String)buffer.remove();
                System.out.println(msg);
            }
        }

       
    }


    import org.apache.commons.collections.buffer.BlockingBuffer;

    Buffer buffer
    =BlockingBuffer.decorate(new UnboundedFifoBuffer());
            BufferListener listener
    =new BufferListener(buffer);
            Thread listenerThread
    =new Thread(listener);
            listenerThread.start();
           
            buffer.add(
    "book1");
            buffer.add(
    "book2");

    ->
    book1
    book2


    3.8 Map的擴(kuò)展


    3.8.1 使用MultiMap實現(xiàn)一鍵存儲多個值
    MultiValueMap會使用一個ArrayList來保存同一個鍵的所有值

    import org.apache.commons.collections.MultiMap;
    import org.apache.commons.collections.map.MultiValueMap;

    MultiMap map
    =new MultiValueMap();
            map.put(
    "key""value1");
            map.put(
    "key""value2");
            map.put(
    "key""value2");
            System.out.println((Collection)map.get(
    "key"));
    ->[value1, value2, value2]

    3.8.2 使用BidiMap實現(xiàn)根據(jù)值檢索鍵
    DualHashBidiMap使用兩個HashMap來保存鍵值對,其中一個正常保存鍵值對,另一個反過來保存值對應(yīng)的鍵。

    import org.apache.commons.collections.BidiMap;
    import org.apache.commons.collections.bidimap.DualHashBidiMap;

    BidiMap map
    =new DualHashBidiMap();
            map.put(
    "key1""value");       
            System.out.println(map.get(
    "key1"));
            System.out.println(map.inverseBidiMap().get(
    "value"));
    ->
    value
    key1

    DualTreeBidiMap是可以記住加入順序的BidiMap,其內(nèi)部使用TreeMap來保存鍵值對。

    3.8.3 大小寫不敏感的CaseInsensitiveMap

    import org.apache.commons.collections.map.CaseInsensitiveMap;
    CaseInsensitiveMap map
    =new CaseInsensitiveMap();
            map.put(
    "KEY""value");.
                    map.put(
    "key""value2");
            System.out.println(map.get(
    "key"));
    ->value2


    3.8.4 指定鍵和值類型(JDK1.4或以下版本)
    如果你使用JDK1.4或以下的版本,你如果需要指定鍵或值的類型,可以使用TypeMap來裝飾。

    import org.apache.commons.collections.map.TypedMap;

    Map map
    =TypedMap.decorate(new HashMap(), String.class, String.class);
            map.put(
    "key""value");
            
    //加入非指定的類型會拋出IllegalArgumentException,程序會停止運行
            map.put("key2"new Integer(12));


    3.8.6 根據(jù)鍵自動生成值的Map

    import org.apache.commons.collections.map.LazyMap;
    Transformer upperFirstLetter
    =new Transformer(){
                
    public Object transform(Object object){
                    String name
    =(String)object;
                    String result
    =name;
                    
    if(name!=null&&!"".equals(name)){
                        result
    =name.substring(0,1).toUpperCase()

    +name.substring(1);
                    }
                    
    return result;
                }
            };
           
            Map map
    =LazyMap.decorate(new HashMap(), upperFirstLetter);
            System.out.println(map.get(
    "heis"));
    ->Heis


    Jakarta Commons Cookbook讀書筆記系列



     



    程序員的一生其實可短暫了,這電腦一開一關(guān),一天過去了,嚎;電腦一開不關(guān),那就成服務(wù)器了,嚎……

    posted on 2010-01-12 22:28 Heis 閱讀(3954) 評論(1)  編輯  收藏 所屬分類: Jakarta Commons Cookbook讀書筆記

    評論

    # re: Jakarta Commons Cookbook讀書筆記--Commons Collections(容器篇之一)  回復(fù)  更多評論   

    頂~
    2010-01-13 11:11 | 朔望魔刃
    主站蜘蛛池模板: 最新中文字幕免费视频| 亚洲国产专区一区| 亚洲AV无码精品国产成人| 亚洲男人的天堂在线va拉文| 国产成人AV片无码免费| 亚洲va久久久久| 亚洲国产精品va在线播放| 好爽又高潮了毛片免费下载| 皇色在线免费视频| 亚洲av永久综合在线观看尤物| 全部免费毛片在线| 黄网站色在线视频免费观看| 午夜不卡AV免费| 亚洲av日韩av综合| 亚洲日韩aⅴ在线视频| 又黄又爽又成人免费视频| 亚美影视免费在线观看| 亚洲avav天堂av在线网爱情| 亚洲日韩欧洲乱码AV夜夜摸| 四虎成人免费影院网址| 无码精品国产一区二区三区免费| 亚洲AV无码专区在线厂| 亚洲的天堂av无码| 亚洲愉拍99热成人精品热久久| 美女网站免费福利视频| 久久久久久免费一区二区三区| MM1313亚洲精品无码久久| 久久精品a亚洲国产v高清不卡| 亚洲精品成a人在线观看| 99热在线精品免费全部my| 国产在线精品观看免费观看| 亚洲国产精品成人综合色在线| 久久亚洲AV成人出白浆无码国产| 亚洲成?v人片天堂网无码| 国内免费高清在线观看| 91福利免费体验区观看区| a成人毛片免费观看| 日韩精品免费一线在线观看 | 久久精品国产亚洲av瑜伽| 亚洲日韩在线视频| 亚洲av片劲爆在线观看|