博客班級 | 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版