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

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

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

    春風(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)

    隨筆分類(lèi)(224)

    隨筆檔案(126)

    個(gè)人軟件下載

    我的其它博客

    我的鄰居們

    最新隨筆

    搜索

    積分與排名

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

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

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

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

    public class Member implements Comparable{
        
    // 名稱(chēng)
        private String name;

        
    // 年齡
        private int age;

        
    // 職位
        private String title;

        
    // 薪水
        private int salary;
        
        .    
        
    }



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

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

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

    然后在用冒號(hào)":"劈分單個(gè)元素,前半部分作為鍵,后半部分作為值,放入一個(gè)Hashtable中:
    key    value
    名稱(chēng) 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)的名稱(chēng)
         * 
    @param propertyNalue 屬性值,如那么對(duì)應(yīng)的Bill
         * 
    @return
         
    */

        
    private boolean setValueToProperty(String propertyName,String propertyNalue){
            
    if(propertyName.equals("名稱(chēng)")){
                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ù)的初衷是,用分支語(yǔ)句建立起鍵值與字段的對(duì)應(yīng)關(guān)系,對(duì)應(yīng)上了則進(jìn)行賦值,這和Mapping有點(diǎn)類(lèi)似,有些轉(zhuǎn)化和驗(yàn)證工作也在分支內(nèi)進(jìn)行,只要驗(yàn)證出現(xiàn)問(wèn)題即退出處理.

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

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

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

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

    sitinspring(http://www.tkk7.com)原創(chuàng),轉(zhuǎn)載請(qǐng)注明出處.
    主站蜘蛛池模板: 99蜜桃在线观看免费视频网站| 日本道免费精品一区二区| 日本人的色道www免费一区| 免费国产一级特黄久久| 亚洲AV无码乱码在线观看裸奔| 三年片在线观看免费观看大全一 | 曰批全过程免费视频在线观看| 中文字幕亚洲综合小综合在线| 午夜神器成在线人成在线人免费| 日本永久免费a∨在线视频| 日韩精品免费在线视频| 无码欧精品亚洲日韩一区夜夜嗨 | 成人黄18免费视频| 中文字幕不卡免费视频| 亚洲一区在线视频| 综合久久久久久中文字幕亚洲国产国产综合一区首 | 免费毛片a线观看| 亚洲精品无码mⅴ在线观看| 色噜噜AV亚洲色一区二区| 91精品免费在线观看| 日本三级在线观看免费| 亚洲第一成年网站视频| 337p日本欧洲亚洲大胆精品555588| 色吊丝永久在线观看最新免费| 日韩电影免费在线观看| 免费无码国产在线观国内自拍中文字幕| 4444亚洲国产成人精品| 相泽亚洲一区中文字幕| 妞干网手机免费视频| 皇色在线视频免费网站| 污污网站免费观看| a级日本高清免费看| 日本特黄特色AAA大片免费| 亚洲av永久无码精品秋霞电影秋| 亚洲一区二区三区免费视频| 亚洲av无码国产精品色午夜字幕| 久久精品亚洲乱码伦伦中文| 四虎免费久久影院| 在线免费一区二区| 成人免费在线视频| 国产高清免费观看|