第一次個人編程作業


博客班級 https://edu.cnblogs.com/campus/fzzcxy/2018SE2
作業要求 https://edu.cnblogs.com/campus/fzzcxy/2018SE2/homework/11169
作業目標 <學會從有多層嵌套內容的長文本中獲取自己想要的信息>
作業源代碼 https://gitee.com/houdini/personal
學號 <211806327>

1、時間記錄

  • 代碼行數:107行
  • 分析時間:2h
  • 編碼時間:2.5h

2、分解需求思路

首先,我的思路是逆過來的

一、獲取經驗值

在看到了題目后,知道要從一大段長文本中獲取經驗值,我馬上就想到了正則表達式
以及其中所包含的兩種情況
第一種,普通的經驗值用"^\d+ 經驗$"

以及第二種,特殊的情況,互評的經驗值,"^互評 \d+ 經驗$"

然后通過上述的正則表達式獲得圖里的“XX 經驗”和“互評 XX 經驗”的String文本,再又一次通過正則表達式獲得這個字符串的數字,也就是我們需要的經驗值

二、分類

從同學們那看到,大家都用在Jsoup來處理html的源碼內容,經過觀察后,我發現所有的經驗值都是在一個類名為"interaction-row"的div塊下

只要通過它的getElementsByClass方法就可以獲得一個個div塊

但其中又存在問題,會有好幾個小div塊合在一起,會出現漏算分數的情況

Document file = Jsoup.parse(new File("small.html"),"UTF-8");
Document file1 = Jsoup.parse(new File("all.html"),"UTF-8");
Elements exps = file.getElementsByClass("interaction-rows");
exps.addAll(file1.getElementsByClass("interaction-row"));
Properties all = new Properties();
all.load(new FileInputStream("total.properties"));

//遍歷出通過利用類名來篩選、分割后的一個個小div塊		
for(Element p:exps) {
      System.out.println(p);
      System.out.println("------");
}

正如上述代碼運行后,下圖所示,本該會出現分割線的地方不會有分割線

所以我想進行進一步的分類
而機緣巧合中,我把題目看錯了,看成了只有①“編程題、附加題”②“課堂完成部分、課堂小測”③“課前自測”這三種經驗值的計算方式
所以我找到了這三種它們的特點

①“編程題、附加題”

查詢了Jsoup的在線API后,我用了select("[data-appraise-type=TEACHER]")來進行再次分類

②“課堂完成部分、課堂小測”

身為上學期的助教,這部分我馬上想到了,上學期老師都是讓我們助教幫忙改,或者,讓我們同學直接互改,所以仔細找后
我發現了以下兩種特點來進一步分類
data-appraise-type="APPRAISER"、data-appraise-type="EACH_OTHER"

③“課前自測”

而自測就很簡單了,是通過問答的形式來進行的
data-type="QUIZ"
但問答形式進行的還有一個“課堂提問”,所以用contains方法獲得“自測”的

而到這,我再看一次題目的計算公式時,我才發現之前的錯誤,打算一錯就錯,先寫下去,后面再優化
就將小div塊,轉換成String字符串,再通過contains方法,通過其中是否包含"編程"、"完成"、"附加"、"小測"、"自測"來完成最后的分類
最后再通過我一開始就想出來的正則表達式方法來獲得經驗值

疑惑

這時,我就來着手優化了,我的打算是,通過類名分類后,直接通過cotains方法來再分類,比原本少了一步
結果這結果讓我大吃一驚,竟然比優化前的運行結算足足少了40分,兩次運行結果如下

於是我將通過contains步驟中都加入一個計數變量
驚訝地發現

for(Element p:exps) {
      String type = p.text();
      if(type.contains("編程")) {
            proSc += getSc(p);
            a++;
      }
      else if(type.contains("附加")) {
            plusSc += getSc(p);
            b++;
      }
      else if(type.contains("自測")) {
            seExSc += getSc(p);
            c++;
      }
      else if(type.contains("完成")) {
            baseSc += getSc(p);
            d++;
      }
      else if(type.contains("小測")) {
            examSc += getSc(p);
            e++;
       }
}
      System.out.println(a+" "+b+" "+c+" "+d+" "+e);


竟然漏了好多個活動的經驗值!!!
然后我再一一遍歷出計數變量有值的那幾個,發現其中好多小div塊連在了一起!!!!
就是寫優化前,上文中我提到的,通過類名分割后,我發現還是好多小div塊連到一起的狀況
而更奇怪的是,我把優化前的代碼進行遍歷輸出后,發現每一個小div塊都是分開的,並沒有連在一起
這個問題我到現在還沒有頭緒,所以只能保留優化前的代碼,希望助教或者老師能幫我解答下,謝謝。

3、參考資料

Jsoup的在線API:https://jsoup.org/apidocs/
Jar包的導入: https://blog.csdn.net/liangayang/article/details/80683384
jdk api 1.8版


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM