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

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

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

    和風(fēng)細(xì)雨

    世上本無難事,心以為難,斯乃真難。茍不存一難之見于心,則運(yùn)用之術(shù)自出。

    用匿名類處理分類匯總的方法

    分類匯總是統(tǒng)計(jì)中常用,舉例來說如統(tǒng)計(jì)學(xué)生成績(jī),及格不及格的歸類,分優(yōu)良中差等級(jí)歸類等,每個(gè)單項(xiàng)代碼很好寫,但是如果分類匯總的項(xiàng)目多了,能一種匯總寫一個(gè)函數(shù)嗎? 比如說有些科目60分才算及格,有些科目50分就算;有些老師喜歡分優(yōu)良中差四等,有些老師卻喜歡分ABCD;不一而足,如果每個(gè)都寫一個(gè)函數(shù)無疑是個(gè)編寫和維護(hù)惡夢(mèng). 如果我們用匿名類把分類匯總的規(guī)則分類匯總的過程分別抽象出來,代碼就清晰靈活多了,以下代碼講述了這個(gè)過程,代碼比較簡(jiǎn)單,這里就不贅述了,相信大家都能看明白.

    代碼下載:
    http://m.tkk7.com/Files/sitinspring/ClassSummary20070928113810.rar

    首先是數(shù)據(jù)的基本類Student:
    public class Student{
        
    private String name;
        
    private int score;
        
        
    public Student(String name,int score){
            
    this.name=name;
            
    this.score=score;
        }

        
        
    public String getName() {
            
    return name;
        }

        
    public void setName(String name) {
            
    this.name = name;
        }

        
    public int getScore() {
            
    return score;
        }

        
    public void setScore(int score) {
            
    this.score = score;
        }
        
    }

    然后是用于分類匯總的類,它強(qiáng)制子類實(shí)現(xiàn)getKey和getvalue兩個(gè)方法:
    public abstract class ClassifyRule {
        
    public Student student;
        
        
    public ClassifyRule(){        
        }
        

        
    public void setStudent(Student student) {
            
    this.student = student;
        }

        
        
    abstract public String getKey();
        
    abstract public int getValue();
    }

    接下來是對(duì)Student進(jìn)行CRUD處理的StudentService類,注意getSum方法,它保留了篩選過程,篩選規(guī)則則不在其中:
    import java.util.ArrayList;
    import java.util.Hashtable;
    import java.util.List;

    public class StudentService {
        
    private List<Student> students;

        
    public StudentService() {
            students 
    = new ArrayList<Student>();
        }


        
    public void add(Student student) {
            students.add(student);
        }


        
    public Hashtable<String, Integer> getSum(ClassifyRule rule) {
            Hashtable
    <String, Integer> ht = new Hashtable<String, Integer>();

            
    for (Student student : students) {
                rule.setStudent(student);
                String key 
    = rule.getKey();
                
    int value = rule.getValue();

                
    if (ht.containsKey(key)) {
                    Integer oldValue 
    = ht.remove(key);
                    oldValue 
    += value;
                    ht.put(key, oldValue);
                }
     else {
                    ht.put(key, value);
                }

            }


            
    return ht;
        }

    }

    最后是測(cè)試代碼,注意其中篩選規(guī)則的創(chuàng)建:
    import java.util.Hashtable;
    import java.util.Iterator;

    public class Test {
        
    public static void main(String[] args) {
            
    // 初始化
            StudentService service = new StudentService();
            service.add(
    new Student("Andy"90));
            service.add(
    new Student("Bill"95));
            service.add(
    new Student("Cindy"70));
            service.add(
    new Student("Dural"85));
            service.add(
    new Student("Edin"60));
            service.add(
    new Student("Felix"55));
            service.add(
    new Student("Green"15));

            
    // 60分及格篩選
            ClassifyRule rule60 = new ClassifyRule() {
                
    public String getKey() {
                    
    return student.getScore() >= 60 ? "及格" : "不及格";
                }


                
    public int getValue() {
                    
    return 1;
                }

            }
    ;

            System.out.println(
    "60分及格篩選");
            printHt(service.getSum(rule60));

            
    // 50分及格篩選
            ClassifyRule rule50 = new ClassifyRule() {
                
    public String getKey() {
                    
    return student.getScore() >= 50 ? "及格" : "不及格";
                }


                
    public int getValue() {
                    
    return 1;
                }

            }
    ;

            System.out.println(
    "\n50分及格篩選");
            printHt(service.getSum(rule50));

            
    // 分"優(yōu)良中差"等級(jí)
            ClassifyRule ruleCn = new ClassifyRule() {
                
    public String getKey() {
                    String retval 
    = "";

                    
    int score = student.getScore();
                    
    if (score >= 90{
                        retval 
    = "優(yōu)";
                    }
     else if (score >= 80{
                        retval 
    = "";
                    }
     else if (score >= 60{
                        retval 
    = "";
                    }
     else if (score > 0{
                        retval 
    = "";
                    }


                    
    return retval;
                }


                
    public int getValue() {
                    
    return 1;
                }

            }
    ;

            System.out.println(
    "\n分優(yōu)良中差等級(jí)篩選");
            printHt(service.getSum(ruleCn));

            
    // 分"ABCD"等級(jí)
            ClassifyRule ruleWest = new ClassifyRule() {
                
    public String getKey() {
                    String retval 
    = "";

                    
    int score = student.getScore();
                    
    if (score >= 90{
                        retval 
    = "A";
                    }
     else if (score >= 80{
                        retval 
    = "B";
                    }
     else if (score >= 60{
                        retval 
    = "C";
                    }
     else if (score > 0{
                        retval 
    = "D";
                    }


                    
    return retval;
                }


                
    public int getValue() {
                    
    return 1;
                }

            }
    ;

            System.out.println(
    "\n分ABCD等級(jí)篩選");
            printHt(service.getSum(ruleWest));
        }


        
    private static void printHt(Hashtable ht) {
            
    for (Iterator it = ht.keySet().iterator(); it.hasNext();) {
                String key 
    = (String) it.next();
                Integer value 
    = (Integer) ht.get(key);
                System.out.println(
    "Key=" + key + " Value=" + value);
            }

        }

    }

    測(cè)試結(jié)果如下:

     

    60分及格篩選
    Key
    =及格 Value=5
    Key
    =不及格 Value=2

    50分及格篩選
    Key
    =及格 Value=6
    Key
    =不及格 Value=1

    分優(yōu)良中差等級(jí)篩選
    Key
    =優(yōu) Value=2
    Key
    =良 Value=1
    Key
    =中 Value=2
    Key
    =差 Value=2

    分ABCD等級(jí)篩選
    Key
    =A Value=2
    Key
    =D Value=2
    Key
    =C Value=2
    Key
    =B Value=1

    原理不復(fù)雜,這個(gè)抽象的過程還是有點(diǎn)意思的.

    posted on 2008-02-22 12:15 和風(fēng)細(xì)雨 閱讀(391) 評(píng)論(0)  編輯  收藏 所屬分類: 算法

    主站蜘蛛池模板: 国产成人免费A在线视频| 高清在线亚洲精品国产二区| 四虎国产精品免费久久影院| 国产亚洲色婷婷久久99精品| 亚洲中文无码a∨在线观看| 国产亚洲精品美女2020久久| 永久在线观看免费视频| 毛片免费观看的视频| 精品国产香蕉伊思人在线在线亚洲一区二区| 国产亚洲综合色就色| 亚洲精品免费网站| 国产性生大片免费观看性 | 免费无码一区二区| 久久精品无码专区免费东京热| 国产成人精品男人免费| 午夜亚洲国产理论秋霞| 无码天堂va亚洲va在线va| 99在线观看精品免费99| 四虎影视永久免费观看地址| 亚洲综合精品香蕉久久网97| 另类图片亚洲校园小说区| 67194成手机免费观看| 亚洲精品无码久久毛片| 亚洲国产最大av| 在线播放免费人成毛片乱码| 日韩视频在线免费| 久久久亚洲裙底偷窥综合| www永久免费视频| 成人免费a级毛片无码网站入口| 亚洲情XO亚洲色XO无码| 亚洲av成人无码网站…| 亚洲精品视频免费看| 亚洲人成网站在线播放vr| www亚洲精品久久久乳| 99久久99这里只有免费费精品| 国产午夜亚洲精品午夜鲁丝片| 亚洲中文无码mv| 曰批视频免费40分钟试看天天| 亚洲中文字幕无码永久在线| 国产AV无码专区亚洲AV麻豆丫 | 亚洲精彩视频在线观看|