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實(shí)例,并使其處于阻塞狀態(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實(shí)現(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實(shí)現(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,程序會停止運(yùn)行
                  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讀書筆記系列



           



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

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

          評論

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

          頂~
          2010-01-13 11:11 | 朔望魔刃
          主站蜘蛛池模板: 平湖市| 神木县| 汪清县| 尚义县| 宕昌县| 花垣县| 平武县| 天全县| 玉林市| 阜阳市| 建昌县| 平泉县| 浠水县| 微博| 阳江市| 高青县| 大名县| 报价| 兰考县| 洛南县| 于都县| 壤塘县| 墨江| 梨树县| 惠东县| 琼结县| 孝义市| 宜都市| 清镇市| 前郭尔| 东乌| 历史| 育儿| 台安县| 泰兴市| 上杭县| 东海县| 溧阳市| 青龙| 巫山县| 石楼县|