<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
    數據加載中……

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

    Jakarta Commons Cookbook讀書筆記系列

    3.5 Iterator的擴展


    3.5.1 循環迭代器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");
            
    //當迭代到最后的元素后,再返回第一個元素重新循環,直至達到迭代次數為止
            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"};
            
    //遍歷下標為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篩選,關于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 過濾重復的元素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()相等)的元素,并可以統計它們的個數。


    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內相應元素的數量
            bag1.removeAll(bag2);
           
            System.out.println(
    "book1: "+bag1.getCount("book1"));
            System.out.println(
    "book2: "+bag1.getCount("book2")+"\n");
           
            
    //bag1保留bag2內的元素,簡單來說就是求交集
            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內部原理是使用一個HashMap當作內部容器,key為加入的對象,對應的value是對象的次數。同理TreeBag使用TreeMap作為內部容器。
    需 要注意的是雖然Bag繼承了Collection,但是它的removeAll(),containsAll(),add(),remove()和 retainAll()方法并不嚴格遵循Collection接口的規范。例如removeAll方法根據規范是移除所有的元素,而Bag的 removeAll是帶參數的,只移除參數包含的元素。

    3.7 用于臨時數據轉移的Buffer


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


    3.7.1 無尺寸緩沖區UnboundFifoBuffer和有尺寸緩沖區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 帶優先級的緩沖區PriorityBuffer
    按照數值從小到大排列

    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來排列優先順序,關于Comparator,請看我的這系列的上一篇文章Jakarta Commons Cookbook讀書筆記--Commons Collections(函子篇)

    import java.util.Comparator;
    //按照銷售數量從大到小排列
    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 使用阻塞式緩沖區BlockingBuffer
    BlokingBuffer裝飾一個Buffer實例,并使其處于阻塞狀態,只要有對象加入則馬上處理。當一個進程調用以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的擴展


    3.8.1 使用MultiMap實現一鍵存儲多個值
    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實現根據值檢索鍵
    DualHashBidiMap使用兩個HashMap來保存鍵值對,其中一個正常保存鍵值對,另一個反過來保存值對應的鍵。

    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,其內部使用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 根據鍵自動生成值的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讀書筆記系列



     



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

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

    評論

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

    頂~
    2010-01-13 11:11 | 朔望魔刃
    主站蜘蛛池模板: 亚洲视频中文字幕在线| 免费夜色污私人影院网站电影| 成年美女黄网站色大免费视频| 亚洲AV噜噜一区二区三区| 国产精品亚洲美女久久久| 久久免费的精品国产V∧| 国产 亚洲 中文在线 字幕| 亚洲综合国产精品第一页| 精品国产无限资源免费观看| 青娱乐在线视频免费观看| 色噜噜综合亚洲av中文无码| 亚洲A∨午夜成人片精品网站| 亚洲a一级免费视频| 久久精品熟女亚洲av麻豆| 亚洲大香人伊一本线| 四虎永久精品免费观看| 99久久久国产精品免费蜜臀| 国产精品成人亚洲| 精品剧情v国产在免费线观看| 久久久精品视频免费观看| 国产亚洲精品一品区99热| 好吊妞在线成人免费| 亚洲午夜免费视频| 成年网站免费入口在线观看| 亚洲三级视频在线| 亚洲av无码专区在线播放| 亚洲第一区精品日韩在线播放| 久久笫一福利免费导航| 免费一级毛片无毒不卡| 成年大片免费高清在线看黄| 色婷五月综激情亚洲综合| 亚洲日本一区二区| 91麻豆精品国产自产在线观看亚洲 | 一级做a毛片免费视频| 亚洲一级毛片免费看| 国产偷v国产偷v亚洲高清| 亚洲国模精品一区| 国产精品99精品久久免费| 亚洲欧洲精品久久| 国产亚洲老熟女视频| 日韩精品成人亚洲专区|