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

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

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

    和風細雨

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

    使用LinkedHashMap進行分數排序

    分數排序的特殊問題

    在java中實現排序遠比C/C++簡單,我們只要讓集合中元素對應的類實現Comparable接口,然后調用Collections.sort();方法即可.
    這種方法對于排序存在許多相同元素的情況有些浪費,明顯即使值相等,兩個元素之間也要比較一下,這在現實中是沒有意義的.
    典型例子就是學生成績統計的問題,例如高考中,滿分是150,成千上萬的學生成績都在0-150之間,平均一個分數的人數成百上千,這時如果排序還用傳統方法明顯就浪費了.

    進一步思考

    成績既然有固定的分數等級,我們可以把相同等級的成績放在一起,以100分為滿分計,共分一百個等級,來一個成績就歸入固定的檔,要得到排序結果時可以從低檔取到高檔,取出來自然就是排序的結果.
    接下來是確定數據結構的問題,檔次-學生群這樣的自然是key-value結構,但Map中的Hashtable和HashMap都不能保持插入時的順序,雖然我們可以從固定的檔次取名單,但這樣略嫌不方便,我們需要更好的數據結構,它既以鍵值的形式存儲數據,又能保持插入時的順序.

    LinkedHashMap橫空出世

    LinkedHashMap正是這樣一個數據結構,它”在HashMap的基礎上增加了一個雙向鏈表,由此LinkedHashMap既能以哈希表的形式存儲數據,又能保持查詢時的順序.”
    下頁就是進行排序用的類,它在構造實例時先創建好分數檔次,加入學生成績時自動歸檔,要取出排序的學生的成績時只要按檔次輸出即可.

    ScoreSorter類

    package com.junglesong;

    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.LinkedHashMap;
    import java.util.List;
    import java.util.Map;

    /**
     * 學生分數排序類
     * 
    @author: sitinspring(junglesong@gmail.com)
     * @date: 2008-3-4
     
    */

    public class ScoreSorter{
        
    /**
         * 學生成績單
         
    */

        
    private Map<Integer,List<Student>> scoreSheet;
        
        
    /**
         * 滿分分數
         
    */

        
    private final int maxScore; 
        
        
    /**
         * 構造函數
         * 
    @param MaxScore: 滿分分數
         
    */

        
    public ScoreSorter(int MaxScore){
            
    this.maxScore=MaxScore;
            scoreSheet
    =new LinkedHashMap<Integer,List<Student>>();
            
            
    for(int i=0;i<=maxScore;i++){
                List
    <Student> ls=new ArrayList<Student>();
                scoreSheet.put(i, ls);
            }

        }

        
        
    /**
         * 添加一個學生成績
         * 
    @param student
         
    */

        
    public void addStudent(Student student){
            
    int score=student.getScore();
            
    if(student.getScore()>maxScore){
                
    return;
            }

            
            List
    <Student> ls=scoreSheet.get(score);
            ls.add(student);
        }

        
        
    /**
         * 得到從低到高的學生成績表
         *
         
    */

        @SuppressWarnings(
    "unchecked")
        
    public List<Student> getSortedScores(){
            List
    <Student> retval=new ArrayList<Student>();
            
            Iterator it
    =scoreSheet.values().iterator();

            
    while(it.hasNext()){
                List
    <Student> ls=(List<Student>)it.next();
                retval.addAll(ls);
            }

            
            
    return retval;
        }

    }

    輔助類Student

    package com.junglesong;

    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;
    import java.util.Random;

    public class Student implements Comparable{
        
    private String name;
        
    private int score;
        
        
    public Student(String name,int score){
            
    this.name=name;
            
    this.score=score;
        }

        
        
    public int compareTo(Object obj){
            Student another
    =(Student)obj;        
            
    return this.score-another.score;
        }

        
        
    public String toString(){
            
    return "學生姓名="+name+" 分數="+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;
        }

        
        
    public static void main(String[] args){
            
    //-----------老排序方案-----------
            /*TimeTest oldSortTest=new TimeTest();
            List<Student> scores=new ArrayList<Student>();
            
            Random random=new Random();
            for(int i=0;i<100000;i++){
                scores.add(new Student("學生"+i,random.nextInt(100)));
            }
            
            Collections.sort(scores);
            //for(Student student:scores){
            //    System.out.println(student);
            //}
            oldSortTest.end("老排序方案耗時");
    */

            
            
    //-----------新排序方案-----------
            TimeTest newSortTest=new TimeTest();
            ScoreSorter sorter2
    =new ScoreSorter(100);
            
            Random random
    =new Random();
            
    for(int i=0;i<1000;i++){
                sorter2.addStudent(
    new Student("學生"+i,random.nextInt(100)));
            }

            
            List
    <Student> ls=sorter2.getSortedScores();
            
    //for(Student student:sorter2.getSortedScores()){
            
    //    System.out.println(student);
            
    //}
            newSortTest.end("新排序方案耗時");    
        }

    }

     

    與傳統排序方案的比較

    在元素個數遠超等級個數即相同的元素很多時,這種方案在速度上稍高于傳統方案,節省的時間主要在不比較同等級元素上.
    這種方案能夠按檔次取出數據,這種優勢是傳統排序方案缺乏的.
    傳統方案普適性比此方案強.

    http://www.tkk7.com/Files/junglesong/ScoreSorter20080304222012.rar

    posted on 2008-03-04 21:06 和風細雨 閱讀(3995) 評論(1)  編輯  收藏 所屬分類: 算法

    評論

    # re: 使用LinkedHashMap進行分數排序 2008-08-02 11:28 天堂明月

    代碼我收下了,有機會一起討論技術吧  回復  更多評論   

    主站蜘蛛池模板: 3344免费播放观看视频| 午夜成人无码福利免费视频| 可以免费观看的毛片| 在线观看亚洲精品国产| 99精品免费视品| 精品亚洲永久免费精品| 国产午夜无码精品免费看动漫| 亚洲综合色成在线播放| 中文字幕免费在线看线人动作大片| 国产亚洲精品影视在线产品 | 成人无码视频97免费| 亚洲欧洲日产国码无码网站| 成人免费一区二区三区 | 国产亚洲精品xxx| 日韩在线不卡免费视频一区| 亚洲精品国产情侣av在线| 美女视频黄a视频全免费| 亚洲国产美女精品久久久| www亚洲精品少妇裸乳一区二区| 有码人妻在线免费看片| 亚洲人成网亚洲欧洲无码久久| 无人在线观看免费高清| 波多野结衣亚洲一级| 亚洲精品无码专区久久同性男| 叮咚影视在线观看免费完整版| 亚洲男人的天堂在线| 国产v片免费播放| 欧洲人免费视频网站在线| 亚洲www在线观看| 在线观看亚洲天天一三视| 亚洲免费网站在线观看| 极品色天使在线婷婷天堂亚洲| 中文字幕亚洲综合久久菠萝蜜| 亚洲精品免费在线观看| 亚洲av无码成人精品国产| 国产亚洲精品影视在线产品 | 免费人妻av无码专区| 免费看一区二区三区四区| 一本色道久久88亚洲精品综合| 亚洲人成色77777在线观看大| 19禁啪啪无遮挡免费网站|