團隊Github實戰訓練

班級:軟件工程1916|Wgit

做業:團隊Github實戰訓練github

團隊名稱:SkyReach正則表達式

Github地址:Github地址算法

貢獻比例表

隊員學號 隊員姓名 這次活動任務 貢獻比例
221600106 陳鴻 資料查詢,代碼審查 4%
221600107 陳家豪 安排任務,撰寫博客,抽獎功能編碼 12%
221600110 公孫駿傑 資料查詢,代碼審查 4%
221600117 黃盛遠 文件數據格式化輸入,數據接口設計 26%
221600118 李鴻斌 抽獎算法設計,抽獎功能編碼 23%
221600120 李子琪 UI設計與編碼 20%
221600122 史雲天 文件數據格式化輸入,數據接口設計 11%

Github提交日誌截圖

程序運行截圖



GUI

基礎功能實現

本算法具備如下模式:編程

  • 不過濾模式:剔除系統、助教、老師,全部參與抽獎的發言,都歸入開獎範圍。api

  • 普通模式:每一個帳號只佔有一條有效抽獎信息。數組

  • 深度模式數據結構

    在普通模式的基礎上,爲了使發言更有意義,提升用戶活躍度:dom

    • 有效發言越多,中獎概率越大

隨機抽獎的算法:函數

LCG算法

咱們的抽獎算法基於LCG算法,LCG(linear congruential generator)線性同餘算法,是一個古老的產生隨機數的算法。
本算法有如下優勢:

  • 計算速度快:抽獎時的算法時間複雜度是一個較大的問題,在微博開獎的時候,因爲抽獎人數衆多,(例如王思聰的抽獎微博,轉發量、評論數、點贊數均達到了兩千萬,總數達到了六千萬,輸入量十分巨大)因此經常須要花費幾十分鐘的時間開獎,如此的算法性能是難以忍受的。對此,咱們的算法基於LCG算法,利用其速度優點,減小開獎時間。
  • 易於實現:算法易於理解,能夠經過改變取餘數來控制算法的空間複雜度與隨機分佈效果。且算法是線性的算法,和非線性的模型相比,具備較低的複雜度。
  • 易於推廣:本算法改變取餘參數,對空間資源和隨機準確率權衡,根據不一樣的設備資源和計算能力調優,具備很強的靈活性,易於使用推廣。

本算法基於的LCG算法由如下參數組成:

參數 m a c X
性質 模數 乘數 加數 隨機數
做用 取模 移位 偏移 做爲結果

LCG算法是以下的一個遞推公式,每下一個隨機數是當前隨機數向左移動 log2 a 位,加上一個 c,最後對 m 取餘,使隨機數限制在 0 ~ m-1 內

img

從該式能夠看出,該算法因爲構成簡單,具備如下優勢:

  • 計算速度快
  • 易於實現
  • 易於寫入硬件

代碼具體實現

public class Random {
    //LCG算法的實現
    public final AtomicLong seed=new AtomicLong();
    public final static long C = 1;
    public final static long A = 48271;
    public final static long M = (1L << 31) - 1;
    public Random(int seed){
        this.seed.set(seed);
    }
    public Random(){
        this.seed.set(System.nanoTime());
    }
    public long nextLong(){
        seed.set(System.nanoTime());
        return (A *seed.longValue() + C) % M;
    }
    public int nextInt(int number){
        return new Long( (A * System.nanoTime()/100+ C) % number).intValue();
    }
    public int[] getLucky(int num){
        Map<Integer,Integer> map=new HashMap<Integer,Integer>();
        for(int i=0;i<100000;i++){
            int ran=new Random().nextInt(num);
            if(map.containsKey(ran)){
                map.put(ran, map.get(ran)+1);
            }else{
                map.put(ran, 1);
            }
        }
        int []luck = new int[num];
        Iterator iter = map.entrySet().iterator();
        while (iter.hasNext()) 
        {
            Map.Entry entry = (Map.Entry) iter.next();
            int key = (Integer)entry.getKey();
            int value = map.get(key);
            luck[key]=value;
        }
        return luck;
    }

附加功能實現

經過哈希表儲存從文本讀入的數據,對其進行有效發言斷定,以及有效發言數量的計算,從而對用戶中獎概率的改變。如下爲代碼實現:

public class Way {
    public static Way create(){
        Way way=new Way();
        return way;
    }
    
    //不過濾抽獎名單
    public List<String> none(List<String> qqs,int num){
        HashMap<String,Integer> map=new HashMap<String,Integer>();
        int luck[]=new Random().getLucky(qqs.size());
        for(int i=0;i<qqs.size();i++){
            map.put(qqs.get(i), luck[i]);
        }
        List<Map.Entry<String,Integer>> list = new ArrayList<Map.Entry<String,Integer>>(map.entrySet());
        
        Collections.sort(list,new Comparator<Map.Entry<String,Integer>>() {
               
                public int compare(Entry<String, Integer> o1,
                        Entry<String, Integer> o2) {
                    return -o1.getValue().compareTo(o2.getValue());
                }
         });
        list=list.subList(0, num);
        List<String> thenone=new ArrayList<String>();
        for(Map.Entry<String,Integer> m:list){ 
            thenone.add(m.getKey());
        } 
        
        return thenone;
    }
    
    //普經過濾抽獎名單
    public List<String> common(HashMap<String, List<Record>> msgs,ProcessQQLog user,int num){
        msgs=clearAssit(msgs,user);
        List<String> qqs=new ArrayList<>(msgs.keySet());
        qqs=none(qqs,num);
        return qqs;
    }
    
    //深度過濾抽獎名單
    public List<String> deep(HashMap<String, List<Record>> msgs,ProcessQQLog user,int num){
        msgs=clearAssit(msgs,user);
        
        return none(msgRate(msgs,num),num);
    }
    
    //將助教及老師從開獎名單中刪除
    public HashMap<String, List<Record>>  clearAssit(HashMap<String, List<Record>> msgs,ProcessQQLog user){
        
    
        Iterator iter = msgs.entrySet().iterator();
        while (iter.hasNext()) 
        {
            Map.Entry entry = (Map.Entry) iter.next();
            String qq = (String)entry.getKey();
            String name=user.getQQName(qq);
            if(name.contains("助教")||name.contains("老師")||qq.equals("10000")||qq.equals("1000008")){
                iter.remove();
                msgs.remove(qq);
            }
        }
        return msgs;
    }
    
    
    //對有效發言次數進行排序 有效發言次數越多中獎概率越大
    public List<String> msgRate(HashMap<String, List<Record>> msgs,int num){
        if(num<20) num*=2;
        HashMap<String,Integer> qqN=new HashMap<String,Integer>();
        
        Iterator iter = msgs.entrySet().iterator();
        while (iter.hasNext()) 
        {
            Map.Entry entry = (Map.Entry) iter.next();
            String qq = (String)entry.getKey();
            List<Record> list = (List<Record>)entry.getValue();
            qqN.put(qq, list.size());
        
        }   
        
        List<Map.Entry<String,Integer>> list = new ArrayList<Map.Entry<String,Integer>>(qqN.entrySet());
        
        Collections.sort(list,new Comparator<Map.Entry<String,Integer>>() {
                public int compare(Entry<String, Integer> o1,
                        Entry<String, Integer> o2) {
                    return -o1.getValue().compareTo(o2.getValue());
                }
              
          });
        list=list.subList(0, num);
        List<String> themsg=new ArrayList<String>();
        for(Map.Entry<String,Integer> m:list){ 
            themsg.add(m.getKey());
        } 
        
        
        return themsg;
        
    }

}

鼓勵有想法且有用的功能

經過哈希表儲存從文本讀入的數據,對其進行有效發言斷定,以及有效發言數量的計算,從而對用戶中獎概率的改變。

遇到的困難及解決方法

  • 組員 李子琪

    困難

    • 有段時間沒有接觸GUI編寫,不少功能又須要從新學習掌握;
    • 因爲負責界面的編寫,因此有時須要等待隊友提供的數據形式才能進行測試;

    解決

    • 經過百度再次瞭解掌握各類組件與監聽器等;
    • 提早與隊友溝通決定數據傳遞的參數,提早先本身進行數據對接,等隊友完成後再進行測試。
  • 組員 李鴻斌

    困難

    • 各類數據結構的相互轉換

    解決

    • 查閱相關api和搜索引擎,還有隊友間相互討論。
  • 組員 黃盛遠

    困難

    • 字符串匹配比較麻煩,甚至一些很差分辨
    • 編碼問題,形成結果與預計不一樣

    解決

    • 上網學習了正則表達式,經過正則表達式匹配。
    • 經過瀏覽他人博客,學習到utf-8與utf-8-dom編碼的區別,經過代碼將utf-8-dom轉化爲utf-8
  • 組員 史雲天

    困難

    • 分離標題欄和內容時不太好分離

    解決

    • 最後採用正則表達式,來判斷是否符合標題的格式,即日期-時間 網名 QQ號
  • 組員 公孫駿傑

    困難

    • 問題主要集中在抽獎的機制上,既要提供一個公平公正的平臺的條件下,還須要進行進一步的篩選過濾選擇中獎用戶

    解決

    • 對結果進行深度過濾
  • 組員 陳鴻

    困難

    • 隊友間的相互溝通 版本更新有的不一樣,和同窗的溝通溝通的函數有的須要分好幾個變量而隊友不須要

    解決

    • 討論了一會才達成一致意見。有的算法不會寫查閱了相關資料才寫出來。
  • 組長 陳家豪

    困難

    • 如何搭建構建數據的組員和抽獎功能編程的組員之間的橋樑

    解決

    • 構建數據接口,對兩方組員闡述各自功能,完成統一的數據接口

PSP表格

陳鴻

PSP2.1 Pesonal SoftWare Process Stages 預估耗時(分鐘) 實際耗時(分鐘)
Planning 計劃 10 12
Estimate 估計這個任務須要多少時間 120 140
Development 開發 220 230
Analysis 需求分析(包括學習新技術) 60 70
Design Spec 生成設計文檔 30 40
Design Review 設計複審 20 30
Coding Standard 代碼規範(爲目前的開發制定合適的規範) 0 0
Design 具體設計 220 230
Coding 具體編碼 0 0
Code Review 代碼複審 0 0
Test 測試(自我測試,修改代碼,提交修改) 40 50
Reporting 報告 30 40
Test Report 測試報告 10 10
Size Measurement 計算工做量
Postmortem&Process Improvement Plan 過後總結,並提出過程改進計劃 30 30
合計 790 855

李子琪

PSP2.1 Personal Software Process Stages 預估耗時(分鐘) 實際耗時(分鐘)
Planning 計劃
• Estimate • 估計這個任務須要多少時間
Development 開發
• Analysis • 需求分析 (包括學習新技術) 10 20
• Design Spec • 生成設計文檔 10 20
• Design Review • 設計複審 20 25
• Coding Standard • 代碼規範 (爲目前的開發制定合適的規範)
• Design • 具體設計 15 15
• Coding • 具體編碼 100 120
• Code Review • 代碼複審 10 15
• Test • 測試(自我測試,修改代碼,提交修改) 20 40
Reporting 報告
• Test Report • 測試報告 10 15
• Size Measurement • 計算工做量 20 20
• Postmortem & Process Improvement Plan • 過後總結, 並提出過程改進計劃 10 10
合計 225 300

李鴻斌

PSP2.1 Personal Software Process Stages 預估耗時(分鐘) 實際耗時(分鐘)
Planning 計劃
• Estimate • 估計這個任務須要多少時間 180 190
Development 開發
• Analysis • 需求分析 (包括學習新技術) 30 40
• Design Spec • 生成設計文檔 10 10
• Design Review • 設計複審 15 10
• Coding Standard • 代碼規範 (爲目前的開發制定合適的規範) 25 20
• Design • 具體設計 15 10
• Coding • 具體編碼 30 35
• Code Review • 代碼複審 15 20
• Test • 測試(自我測試,修改代碼,提交修改) 30 25
Reporting 報告
• Test Report • 測試報告 20 20
• Size Measurement • 計算工做量 10 10
• Postmortem & Process Improvement Plan • 過後總結, 並提出過程改進計劃 20 30
合計 230 230

公孫駿傑

PSP2.1 Personal Software Process Stages 預估耗時(分鐘) 實際耗時(分鐘)
Planning 計劃
• Estimate • 估計這個任務須要多少時間 10 10
Development 開發
• Analysis • 需求分析 (包括學習新技術) 50 70
• Design Spec • 生成設計文檔 30 50
• Design Review • 設計複審 10 10
• Coding Standard • 代碼規範 (爲目前的開發制定合適的規範) 20 20
• Design • 具體設計 60 60
• Coding • 具體編碼 150 180
• Code Review • 代碼複審 30 30
• Test • 測試(自我測試,修改代碼,提交修改) 20 20
Reporting 報告
• Test Report • 測試報告 20 20
• Size Measurement • 計算工做量 10 10
• Postmortem & Process Improvement Plan • 過後總結, 並提出過程改進計劃 40 40
合計 560 630

史雲天

PSP2.1 Personal Software Process Stages 預估耗時(分鐘) 實際耗時(分鐘)
Planning 計劃 20 10
• Estimate • 估計這個任務須要多少時間 10 5
Development 開發
• Analysis • 需求分析 (包括學習新技術) 60 50
• Design Spec • 生成設計文檔 30 40
• Design Review • 設計複審 20 10
• Coding Standard • 代碼規範 (爲目前的開發制定合適的規範) 40 30
• Design • 具體設計 30 20
• Coding • 具體編碼 180 240
• Code Review • 代碼複審 20 30
• Test • 測試(自我測試,修改代碼,提交修改) 60 60
Reporting 報告
• Test Report • 測試報告 30 40
• Size Measurement • 計算工做量 10 5
• Postmortem & Process Improvement Plan • 過後總結, 並提出過程改進計劃 30 25
合計 540 565

黃盛遠

PSP2.1 Personal Software Process Stages 預估耗時(分鐘)
Planning 計劃
• Estimate • 估計這個任務須要多少時間 180
Development 開發
• Analysis • 需求分析 (包括學習新技術) 10
• Design Spec • 生成設計文檔 10
• Design Review • 設計複審 15
• Coding Standard • 代碼規範 (爲目前的開發制定合適的規範) 5
• Design • 具體設計 15
• Coding • 具體編碼 60
• Code Review • 代碼複審 15
• Test • 測試(自我測試,修改代碼,提交修改) 30
Reporting 報告
• Test Report • 測試報告 20
• Size Measurement • 計算工做量 10
• Postmortem & Process Improvement Plan • 過後總結, 並提出過程改進計劃 20
合計 195

陳家豪

PSP2.1 Personal Software Process Stages 預估耗時(分鐘) 實際耗時(分鐘)
Planning 計劃 20 10
• Estimate • 估計這個任務須要多少時間 10 5
Development 開發
• Analysis • 需求分析 (包括學習新技術) 60 30
• Design Spec • 生成設計文檔 30 40
• Design Review • 設計複審 20 10
• Coding Standard • 代碼規範 (爲目前的開發制定合適的規範) 40 30
• Design • 具體設計 30 20
• Coding • 具體編碼 180 200
• Code Review • 代碼複審 20 30
• Test • 測試(自我測試,修改代碼,提交修改) 60 60
Reporting 報告
• Test Report • 測試報告 30 40
• Size Measurement • 計算工做量 10 5
• Postmortem & Process Improvement Plan • 過後總結, 並提出過程改進計劃 30 25
合計 540 505

學習進度表

姓名 新增代碼(行) 累計代碼(行) 本週學習耗時(小時) 累計學習耗時(小時) 重要成長
陳家豪 100 100 10 10 複習JAVA,學習LCG算法
李子琪 400 400 12 12 複習JAVAUI設計
黃盛遠 250 250 15 15 複習JAVA,學習使用哈希表
史雲天 100 100 8 8 複習JAVA,學習使用哈希表
李鴻斌 170 170 10 10 複習JAVA,學習LCG算法
公孫駿傑 50 50 7 7 複習JAVA
陳鴻 50 50 7 7 複習JAVA
相關文章
相關標籤/搜索