春風(fēng)博客

          春天里,百花香...

          導(dǎo)航

          <2007年12月>
          2526272829301
          2345678
          9101112131415
          16171819202122
          23242526272829
          303112345

          統(tǒng)計(jì)

          公告

          MAIL: junglesong@gmail.com
          MSN: junglesong_5@hotmail.com

          Locations of visitors to this page

          常用鏈接

          留言簿(11)

          隨筆分類(224)

          隨筆檔案(126)

          個(gè)人軟件下載

          我的其它博客

          我的鄰居們

          最新隨筆

          搜索

          積分與排名

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          一個(gè)解析文本中的信息并向?qū)ο筚x值過程的思考.

          首先解釋一下,文本中的信息指的是 對(duì)象在文本文件中的描述,如"名稱:Bill 職位:SSE 年齡:45  薪水:10000"這個(gè)形式的.要求把這樣的信息轉(zhuǎn)換到對(duì)象Member中,對(duì)錄入出錯(cuò)的情況如年齡薪水有非數(shù)字字符需要加以鑒別.

          對(duì)象基本信息如下:

          public class Member implements Comparable{
              
          // 名稱
              private String name;

              
          // 年齡
              private int age;

              
          // 職位
              private String title;

              
          // 薪水
              private int salary;
              
              .    
              
          }



          從這段字符串中找到相關(guān)的信息并設(shè)置到Member對(duì)象的相關(guān)屬性中并不難,但有幾個(gè)地方需要多加考慮:
          1.名稱職位薪水年齡的順序不一定一致.
          2.職位薪水年齡三個(gè)字段和值有可能沒有.
          3.有可能需要增加字段,此時(shí)類也需要修改.

          處理程序需要考慮解析,驗(yàn)證,賦值三個(gè)環(huán)節(jié),如果耦合在一起處理當(dāng)然也能做出來,但這樣做可讀性和可維護(hù)性都不好,也背離了面向?qū)ο蟮某踔?好的方案應(yīng)該把這三部分分開制作函數(shù)處理.

          文本解析部分:
          我的想法是首先將"名稱:Bill 職位:SSE 年齡:45  薪水:10000"以空格劈分成包含這樣元素的鏈表:
          名稱:Bill
          職位:SSE
          年齡:45 
          薪水:10000

          然后在用冒號(hào)":"劈分單個(gè)元素,前半部分作為鍵,后半部分作為值,放入一個(gè)Hashtable中:
          key    value
          名稱 Bill
          職位 SSE
          年齡 45 
          薪水 10000

          解析部分代碼如下:

              /**
               * 將分段字符串鏈表轉(zhuǎn)化成成員鏈表,不成功者記入錯(cuò)誤鏈表
               * 
               * 
          @param segmentList
               *            分段字符串鏈表
               
          */

              
          private void changeSegmentToMember(List<String> segmentList) {
                  
          for (String segment : segmentList) {
                      Map
          <String, String> ht = StringUtil.parseStr2Map(segment, " "":");

                      Member member 
          = new Member();

                      
          if (member.setHtToProperties(ht)) {
                          
          // 成功賦值,將成員放入成員列表
                          memberList.add(member);
                      }
           else {
                          
          // 有任何錯(cuò)誤,將分段信息放入錯(cuò)誤鏈表
                          errorList.add(segment);
                      }

                  }

              }



          賦值和驗(yàn)證部分:
          然后把這個(gè)Hashtable傳入到Member的一個(gè)函數(shù)setHtToProperties中,這個(gè)函數(shù)的任務(wù)是對(duì)Hashtable中的鍵值對(duì)進(jìn)行遍歷,在調(diào)用函數(shù)setValueToProperty對(duì)字段進(jìn)行賦值:

          代碼如下:

              /**
               * 將哈息表中成對(duì)的值按規(guī)則輸入屬性
               * 
          @param ht
               * 
          @return
               
          */

              
          public boolean setHtToProperties(Map<String,String> ht){
                  Iterator it
          =ht.keySet().iterator();
                  
                  
          while(it.hasNext()){
                      String key
          =(String)it.next();
                      String value
          =(String)ht.get(key);
                      
                      
          boolean isSettted=setValueToProperty(key,value);
                      
                      
          if(isSettted==false){
                          
          return false;
                      }

                  }

                  
                  
          return true;
              }

              
              
          /**
               * 在mapping關(guān)系中用屬性名去找屬性對(duì)應(yīng)的變量,是則賦值;如找不到或轉(zhuǎn)化出錯(cuò)則返回假
               * 
          @param propertyName 屬性名,如name對(duì)應(yīng)的名稱
               * 
          @param propertyNalue 屬性值,如那么對(duì)應(yīng)的Bill
               * 
          @return
               
          */

              
          private boolean setValueToProperty(String propertyName,String propertyNalue){
                  
          if(propertyName.equals("名稱")){
                      name
          =propertyNalue;
                  }

                  
          else if(propertyName.equals("年齡")){
                      
          try{
                          
          int ageTemp=Integer.parseInt(propertyNalue);
                          age
          =ageTemp;
                      }

                      
          catch(Exception e){
                          
          return false;
                      }
                      
                  }

                  
          else if(propertyName.equals("職位")){
                      title
          =propertyNalue;
                  }

                  
          else if(propertyName.equals("薪水")){
                      
          try{
                          
          int salaryTemp=Integer.parseInt(propertyNalue);
                          salary
          =salaryTemp;
                      }

                      
          catch(Exception e){
                          
          return false;
                      }

                  }

                  
          else{
                      
          return false;
                  }


                  
          return true;
              }


          建立setValueToProperty函數(shù)的初衷是,用分支語句建立起鍵值與字段的對(duì)應(yīng)關(guān)系,對(duì)應(yīng)上了則進(jìn)行賦值,這和Mapping有點(diǎn)類似,有些轉(zhuǎn)化和驗(yàn)證工作也在分支內(nèi)進(jìn)行,只要驗(yàn)證出現(xiàn)問題即退出處理.

          這樣的處理方法帶來了如下好處:
          1.外界的類只需要解析文本,不需也不應(yīng)該知道如何向Member的對(duì)應(yīng)字段賦值,這個(gè)工作應(yīng)該由Member自己進(jìn)行,setHtToProperties函數(shù)幫助達(dá)成了這一點(diǎn),有效降低了Member和其它類的耦合程度.
          2.即使職位薪水年齡三個(gè)字段和值缺失,也不影響其它字段的賦值過程.
          3.如果增加字段,setValueToProperty函數(shù)中只需要增加一個(gè)Mapping分支即可,其它地方無須改動(dòng).
          4.對(duì)數(shù)據(jù)的校驗(yàn)工作可以統(tǒng)一在setValueToProperty函數(shù)中完成.

          進(jìn)行了如此處理后,代碼量也不見得比混合處理多多少,而程序更加清晰,適應(yīng)性也增強(qiáng)了,經(jīng)得起不斷更改. 比解析驗(yàn)證賦值混合在一起的方案要強(qiáng)的多.

          完整代碼下載:
          http://www.aygfsteel.com/Files/sitinspring/MemberProcessor20071207163615.rar

          posted on 2007-12-07 16:35 sitinspring 閱讀(496) 評(píng)論(0)  編輯  收藏 所屬分類: Object Orient Programming

          sitinspring(http://www.aygfsteel.com)原創(chuàng),轉(zhuǎn)載請(qǐng)注明出處.
          主站蜘蛛池模板: 济阳县| 沙田区| 大余县| 琼结县| 英吉沙县| 荔波县| 江山市| 彭阳县| 德化县| 靖西县| 中西区| 渑池县| 涟源市| 万源市| 平乐县| 惠州市| 岐山县| 梧州市| 杭州市| 娱乐| 兴仁县| 望城县| 盱眙县| 瓦房店市| 彩票| 即墨市| 西安市| 太和县| 黄龙县| 安平县| 德州市| 和硕县| 诸暨市| 上蔡县| 永胜县| 都兰县| 芷江| 大名县| 沁源县| 乐东| 勐海县|