初涉java庫--ArrayList,java--arraylist
我的車就差一個輪子啦,造好輪子,我就飛上天與太陽肩並肩啦,想想都激動。什麼你要自己造輪子,是不是傻,商店裡不都是別人造好的嗎,又好又方便,只需一點money,你沒有money,那你只能做個安靜的美男子啦。幸運的是編程世界中的輪子不需要money,今天就來看看如何調用庫中的輪子。
今天的內容:
一.修改bug 這篇部落格是接著上篇的,沒有看的,請點擊此出查看:上一篇隨筆現在揭示那個程式的最大的bug:看測試代碼,你可能已經猜到啦。看結果:沒錯,你可以連續猜同一個位置來過關,看看哪裡錯啦,肯定是在checkYourself方法裡,看看原始碼:
1 public String checkYourself(int guess) { 2 String result = "miss"; 3 for(int i: localCells) { 4 if ( i == guess) {//就在這裡,猜中後沒有做任何處理 5 result = "hit"; 6 numOfHit ++; 7 break; 8 } 9 }10 if (numOfHit == 3) {11 result = "kill";12 }13 return result;14 }
既然知道了問題,就該解決它。你可以有以下解決方案。
1.再建立一個boolean[] hitFlag = {false, false, false},猜中哪個位置,就把對應的hitFlag數組中的位置設定為true, 在猜中之後查看hitFlag中相應位置的狀態若為false,則成功,否則猜過,此次失敗。
這個方法是最笨的,所以一般聰明的你不會想到。
2.猜中後可以把那個位置的數字設定為 -1,哈哈,瞬間感覺世間好美好啊。但為什麼不把猜過的去掉呢?從而只需判斷你的猜測結果是否在localCells裡就行啦。
3.要是有一種能縮放的數組就好啦,把沒必要的東西都從裡面剔除掉,這樣,程式運行越來越好啊。有沒有呢?還真有一個,java庫中有個ArrayList,非常符合這個要求。
二、ArrayList:哈哈,他的方法如此的完美的適應我們的程式,可是你可能會想,如果我不說,你要從哪裡知道這些東西,這個我會稍後再說一下這個問題。注意一個問題:
ArrayList不能直接存primitive類型,只能存對象,你非要存的話,可以寫個封裝類,不過java 5之後,編譯器可以自動把primitive類型轉換為類。現在修改bug,只需稍微改變一下程式就好啦。
import java.util.ArrayList;public class SimpleDotCom { private ArrayList<String> localCells; //private int[] dotCom; //private int numOfHit = 0; public void setDotCom(ArrayList<String> localCells) { this.localCells = localCells; } //明顯好多啦 public String CheckYourself(String guess) { String result = "miss"; if (localCells.contains(guess)) { result = "hit"; localCells.remove(guess); } if (localCells.isEmpty()) { result = "kill"; } return result; }}
測試代碼:
1 import java.util.*; 2 public class Test { 3 public static void main(String[] args) { 4 SimpleDotCom dotCom = new SimpleDotCom(); 5 ArrayList<String> localCells = new ArrayList(); 6 localCells.add("1"); 7 localCells.add("2"); 8 localCells.add("3"); 9 dotCom.setDotCom(localCells);10 11 String result = dotCom.CheckYourself("1");12 System.out.println("result = " + result);13 14 result = dotCom.CheckYourself("1");15 System.out.println("result = " + result);16 17 result = dotCom.CheckYourself("2");18 System.out.println("result = " + result);19 20 result = dotCom.CheckYourself("3");21 System.out.println("result = " + result);22 23 24 }25 26 }
結果就正確啦:簡單版的DotCom已經完成啦,別忘了我們的初衷哦,要寫一個完整版的dotcom,不過代碼稍微有點多而且有點複雜,要靜下心來看,所以就跳轉到另一個隨筆,去看完整版的代碼吧。
下面幾句話中的知識比較細小,但我認為還是不錯的。 在說個問題,java中的類都是存在包(package)中的,使用報的優點有三點:
- 幫你結構化的管理你的項目,避免一大堆檔案放在一起。
- 幫你分類,如與圖形庫有關的api,都在javax.swing包中,與事件有關的都在java.awt中。
- 是你的程式更安全,只有包內的檔案之間是可見的,你可以認為這個功能和c++ c#中的命名空間一樣。
再稍微解釋一下,為什麼有的包名多出個“X”,如swing的javax。名字為“java"的包是剛開始的標準庫, ”java“是後來擴充為java標準庫的。
你使用java類必須使用其全名,比如,你使用的System.out。ArrayList 你必須這樣是使,java.util.ArrayList<String> list = new java.util.ArrayList<String>();。但誠如你所見,你沒有這樣寫,因為檔案前面的 import java.util.*,引入java.util包下的所有東西(不太恰當)。你可能會疑惑 使用String時,你啥也沒import 啊,非常常用的類都在java.lang中,所以java.lang已是預設的包。如果你學過c/c++,你可能認為 import 越多,你的程式越大,那你就錯啦。import xxx。可沒有把xxx下的東西都拷進來,只是幫你需要xxx全名的地方省去這個全名而已。
三、布爾值運算式java中的true and false 不像 c/c++中的布爾值,c/c++中的true 就是整形值 1, false == 0, 而且條件判斷會把非零的值看作真,看看下邊的c語言代碼: 結果:而java中的boolean本身就是一種類型,條件判斷只認boolean類型,上邊的代碼如果是java肯定會錯的。說說強大的布林運算式。如果你學過c語言這就很好理解啦。
- &&:運算式1 && 運算式2 && 。。。,當各給運算式都為true時,結果為true,否則為false. 如: 1 == 2 && 1 == 1 結果為false, 1 == 1 && 2 > 1 為true.
- ||:運算式1 || 運算式2 || 運算式3.。。。,當各個運算式有個為true,結果為true,和&&相反。如:1 == 2 || 1 == 1 結果為true, 1 < 0 || 2 == 1為false
- !:!運算式,把運算式的結果反過來, 如 !1 == 2, 為true, !false, 為true, !true 為false
- &:和 && 一樣,這點與c語言不一樣,但它常用於二進位與運算這點和c語言。
- |:同 &
注意:& 與 | 和 && 與 || 不同之處在於, 運算式1 && 運算式2,若運算式1結果為 false,則運算式2就不會執行啦,而 & 的運算式都會執行, | 與 || 同前面所訴。
四、java API
API我們封裝了很多常用的功能,避免了我們重複造輪子的工作。我們只需學會怎樣使用api就可以啦(對於我們新手而言),對於小白的我們,how do I go from a need-to-do-something to a-way-to-do-it using the API,有兩種常用的方式,一是買個參考書,根據自己的需要去找想要的api,參考書會為你提供api的使用文法的。
另一種就是html 文檔啦,免費又方面,強烈推薦它,比參考書詳細,而且時效性好,上官方隨時下最新的文檔。
每日一句:
It seems the harder I work, the more luck I have.
越努力越幸運。