20155303 2016-2017-2 《Java程序設計》第九周學習總結
目錄
學習內容總結
Linux命令(sort/cat/split/join)
『sort』:sort將文件/文本的每一行作為一個單位,相互比較,比較原則是從首字符向后,依次按ASCII碼值進行比較,最后將他們按升序輸出。
- 語法:
sort(選項)(參數)
- 常用選項:
- -b:忽略每行前面開始出的空格字符;
- -c:檢查文件是否已經按照順序排序;
- -d:排序時,處理英文字母、數字及空格字符外,忽略其他的字符;
- -f:排序時,將小寫字母視為大寫字母;
- -i:排序時,除了040至176之間的ASCII字符外,忽略其他的字符;
- -k:排序時,指定本域的開頭和結尾;
- -m:將幾個排序號的文件進行合並;
- -M:將前面3個字母依照月份的縮寫進行排序;
- -n:依照數值的大小排序;
- -o<輸出文件>:將排序后的結果存入制定的文件;
- -r:以相反的順序來排序;
- -t<分隔字符>:指定排序時所用的欄位分隔字符;
- +<起始欄位>-<結束欄位>:以指定的欄位來排序,范圍由起始欄位到結束欄位的前一欄位。
- 參數:指定待排序的文件列表。
- 注意:使用
-k +<起始欄位>-<結束欄位>
這一命令時,若“只”根據本域的第n個字符進行排序,則使用-k n,n
。
『cut』:cut命令用來顯示行中的指定部分,刪除文件中指定字段。
- 語法:`cut(選項)(參數)
- 常用選項:
- -b:僅顯示行中指定直接范圍的內容;
- -c:僅顯示行中指定范圍的字符;
- -d:指定字段的分隔符,默認的字段分隔符為“TAB”;
- -f:顯示指定字段的內容;
- -n:與“-b”選項連用,不分割多字節字符;
- --complement:補足被選擇的字節、字符或字段;
- --out-delimiter=<字段分隔符>:指定輸出內容是的字段分割符;
- --help:顯示指令的幫助信息;
- --version:顯示指令的版本信息。
- 參數:指定要進行內容過濾的文件。
- 注意:cut命令主要是接受三個定位方法:第一,字節(bytes),用選項-b;第二,字符(characters),用選項-c;第三,域(fields),用選項-f。如果需要提取中文,使用-b就會出現亂碼情況。所以,當遇到多字節字符時,可以使用-n選項,-n用於告訴cut不要將多字節字符拆開。
『split』:可以將一個大文件分割成很多個小文件
- 語法:split (選項)(輸入(前綴))
- 參數:
- -b:值為每一輸出檔案的大小,單位為 byte。
- -C:每一輸出檔中,單行的最大 byte 數。
- -d:使用數字作為后綴。
- -l:值為每一輸出檔的列數大小。
- 注意:
- 如果想用數字后綴可使用-d參數,同時可以使用-a length來指定后綴的長度
『join』:用來將兩個文件中,將指定欄位內容相同的行連接起來。
- 語法:join(選項)(參數1)(參數2)
- 選項:
- -a<1或2>:除了顯示原來的輸出內容之外,還顯示指令文件中沒有相同欄位的行;
- -e<字符串>:若[文件1]與[文件2]中找不到指定的欄位,則在輸出中填入選項中的字符串;
- -i或--ignore-case:比較欄位內容時,忽略大小寫的差異;
- -o<格式>:按照指定的格式來顯示結果;
- -t<字符>:使用欄位的分割字符;
- -v<1或2>:更-a相同,但是只顯示文件中沒有相同欄位的行;
- -1<欄位>:連接[文件1]指定的欄位;
- -2<欄位>:連接[文件2]指定的欄位。
- 參數:要進行合並操作的第一個文件參數和第二個文件參數。
- 注意:如果行內容不匹配,則不能進行該操作,如:
教材學習中的問題和解決過程
-
『問題一』MySQL支持的SQL語法都有哪些?
-
『問題一解決』
SQL是結構化查詢語言,主要用於訪問和處理數據庫的計算機語言。
(1)MySQL的數據類型
MySQL的數據類型大致分為以下幾類,數值類型、字符串類型、日期和時間類型。
(2)創建數據庫
在創建數據庫之前,必須先創建數據庫,在MySQL中,創建數據庫的代碼如下:
create database wuzydb default character set utf8
以上代碼創建了wuzydb數據庫,並設置編碼為utf8。
(3)創建表
表必須在數據庫中創建,所以在創建表之前,需調用use wuzydb
;
創建表:create table 表名(字段 字段類型...)
(4)對表中數據進行增刪改查
①insert
插入:insert into 表名(字段1,字段2...)values(值1,值2...)
②select
查找:select * from 表名
(查詢所有數據);select 字段1,字段2...from 表名
(查詢某幾個字段的數據)
③update
修改:update 表名 set 字段1=值1,字段2=值2...
④delete
刪除:deleta from 表名
代碼調試中的問題和解決過程
- 『問題一』
學習正則表達式的過程中,運行測試代碼時出現了“Red Bar”,如下:
運行結果顯示,"\"Hello\"".matches("([\"'])[^\"']*\1")
為false。哪里出錯了呢?
- 『問題一解決』
把regex復制到正則表達式測試器
上運行,結果是匹配的:
那么,問題只能出在這行代碼上,而不是正則表達式本身。只有一種可能,就是沒有正確使用Java中的轉義字符,導致程序不能正確匹配。
再返回去看程序中的正則表達式,發現忽略了最后一個轉義符。()
表示將括號里的分組,后面的\1
表示反向引用第一組,而在Java中,\
本身就是轉義符,表示忽略\
后面的內容,所以,要想使用“反向引用”這個含義,必須再次使用\
進行轉義。再次運行,發現斷言正確,說明我們的分析是正確的。
- 『問題二』
在學習命令行時,參考資料經常使用/etc/passwd
文件進行演示,那么,/etc/passwd
以及/etc/shadow
是什么文件呢:
- 『問題二解決』
查閱相關資料了解到,在Linux操作系統中, /etc/passwd文件中的每個用戶都有一個對應的記錄行,記錄着這個用戶的一下基本屬性。我們通過命令行cat /etc/passwd
查看/etc/passwd
文件內容:
我們可以看到,/etc/passwd中一行記錄對應着一個用戶,每行記錄又被冒號(:)分隔為7個字段,其格式和具體含義如下:用戶名:口令:用戶標識號:組標識號:注釋性描述:主目錄:登錄Shell
/etc/shadow文件格式與/etc/passwd文件格式類似,同樣由若干個字段組成,字段之間用“:”隔開。但需要注意的是,/etc/shadow文件只有系統管理員才能夠進行修改和查看:
/etc/shadow文件中的記錄行與/etc/passwd中的一一對應,它由pwconv命令根據/etc/passwd中的數據自動產生。文件中字段主要含義為:登錄名:加密口令:最后一次修改時間:最小時間間隔:最大時間間隔:警告時間:不活動時間:失效時間:標志
代碼托管
上周考試錯題總結
- 『問題一』NIO2中,可以使用(D)中的方法取出文件系統根目錄信息。
A .Path
B .DirectoryStream
C .FileStore
D .FileSystem
『考點』:FileSystem
的getRootDirectorie
方法可以取出文件系統根目錄信息。對NIO各個方法還不夠熟悉。
- 『問題二』:正則表達式“(‘|”)(.*?)\1”匹配 “'Hello',"World””的結果是(BC)
A .不匹配
B .'Hello'
C ."World"
D .'Hello',"World"
『考點』:.*
是貪婪量詞,會盡量匹配更多;而本題中的.*?
是懶惰量詞,盡量匹配少。所以匹配結果為'Hello'
和"World"
兩個。另外,反向引用 \1 代表第一個()中的匹配內容。
- 『問題三』:正則表達式“r.t”匹配字符串“rat”的Java 代碼表達式是()
A ."rat".matcher("r.t")
B ."r.t".matcher("rat")
C .Pattern.compile("rat").matcher("r.t")
D .Pattern.compile("r.t").matcher("rat")
『考點』:課本P491提到,java.util.regex.Pattern
實例是正則表達式在JVM中的代表對象,需通過compile()
方法來取得。在取得Pattern
實例后,可以使用matcher()
方法指定要比較的字符串。
- 『問題四』:Suppose we have an array of String objects identified by the variable names. Which of the following for loops will not correctly process each element in the array.(假如我們有一個名為names的String對象數組,下面哪個for循環不能遍歷數組中的每一個元素?)(C)
A .for(int i = 0; i < names.length; i++)
B .for(String name : names)
C .for(int i = 0; i < names.length(); i++)
D .none of these will correctly process each element(以上都不能遍歷)
E .all of these will correctly process each element(以上都能遍歷)
『考點』:長度length
是成員變量,不是方法,所以不能加括號。C錯誤。
結對及互評
結對對象:20145202馬超
結對學習內容:解決對方學習過程中遇到的問題
學習感悟及思考
本周學習最大的收獲來自於實驗和正則表達式的學習。實驗的內容很豐富,在夯實基礎的同時,也加深我們對知識的理解和掌握。
學習過程中遇到不少問題,畏難情緒時常讓我產生退縮的念頭。不過,唾手可得的知識真的有價值嗎?我看未必。
以本周正則表達式的學習為例,一個非常簡單的正則表達式用Java程序運行起來卻不符合預期,帶着疑惑請教老師,老師建議我先在regextester上跑通再運行程序。可是把程序中的正則表達式復制過去卻是匹配的,仔細想了想,明白出錯的原因在於忽略了Java中的轉義符。
這個問題本可以直接回答我錯誤在哪里,老師卻提供給我一種方法而不僅僅是一個答案。摸索的過程雖然比直接得到答案來的艱難,但授人以魚不如授人以漁,今后再遇到相似的問題,就都可以自行解決了。
墨非定律告訴我們: 如果你認為事情會向壞的方向發展,那么事情一定會那樣。所以,絕不說“不可能”,不斷挑戰自我才能更快地成長。
學習進度條
代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 5000行 | 30篇 | 400小時 | |
第一周 | 16/16 | 1/1 | 18/18 | 初步認識了Java |
第二周 | 219/235 | 1/2 | 28/46 | 學習了Java的基本語法知識 |
第三周 | 766/1001 | 1/3 | 23/69 | 了解對象與參考的關系,以及封裝的概念與實現 |
第四周 | 984/1985 | 1/4 | 18/87 | 學習了繼承與多態的關系,以及接口的多態操作 |
第五周 | 866/2851 | 1/5 | 12/99 | 學習了異常處理,學會使用Collection收集對象 |
第六周 | 664/3515 | 1/6 | 15/114 | 認識字節流和字符流的繼承架構,學習線程與並行API |
第七周 | 469/3984 | 1/7 | 13/127 | 認識Date與Calender |
第八周 | 315/4299 | 1/8 | 15/142 | 學習了NIO、日志、正則表達式等內容,復習第六章“繼承與多態”和“Linux 目錄結構及文件基本操作” |
第九周 | 553/4852 | 1/9 | 20/142 | 學習了數據庫、反射與類加載器、自定義泛型枚舉與注釋等內容,復習常用命令join、cut、split和sort |
嘗試一下記錄「計划學習時間」和「實際學習時間」,到期末看看能不能改進自己的計划能力。這個工作學習中很重要,也很有用。
耗時估計的公式
:Y=X+X/N ,Y=X-X/N,訓練次數多了,X、Y就接近了。
-
計划學習時間:15小時
-
實際學習時間:20小時
(有空多看看現代軟件工程課件:軟件工程師能力自我評價表)