20155303 2016-2017-2 《Java程序設計》第九周學習總結


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

『考點』:FileSystemgetRootDirectorie方法可以取出文件系統根目錄信息。對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小時

(有空多看看現代軟件工程課件:軟件工程師能力自我評價表)

返回目錄

參考資料


免責聲明!

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



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