2009年1月12日

Java輕鬆玩 - 陣列與水果盒之間的關係

Java輕鬆玩(Java for Fun)」 系列文章,想要讓一些有電腦基礎、但不太會寫程式的朋友,也能夠在喝杯咖啡的午後時光,悠閒地利用Java創作電腦程式。寫程式是件有趣的事,就像小時候 玩的積木,能夠訓練邏輯思考及培養創造力,也純粹就是為了好玩而已。有趣的前提必須是「為自己的樂趣寫程式(Coding for Fun)」,自己能夠做出工具解決問題,將會有充滿成就感的快樂。我們假設你每天都能有30分鐘的時間可以"玩樂",先花個10分鐘把我們的教學短文看 完,跟著完成設定及範例程式碼,接著就能用20分鐘把它重新組合,用您獨特的想法創作出自己的程式。

那就這樣吧

我們再次假設你已經安裝好JDK與Groovy,並且通過第一課的考驗。在這個寒冷的天氣,我們就別談太多的廢話,直接開始今天的Java&Groovy之旅吧!

其實你已經知道什麼是陣列

在你的大腦記憶體中,一定裝有陣列這東西,儘管寫程式的人喜歡叫它作陣列,並且說它是一種資料結構,但我認為用太多術語會讓人覺得宅。

請看著下圖,它理所當然是個箱子,我不知道圖從哪來的,但它很顯然就是個方形的箱子。郵局把它印幾隻鴿子上去,就叫它便利箱,並且一個賣你含郵資70元。在程式語言的世界裡,並沒有在上面印鴿子,而是把它變成記憶體中虛幻飄渺的東西,就叫做陣列。無論如何,它就是個箱子。

在箱子可以裝進小箱子,例如你可以把下方的小箱子裝進去。

如果你只放一排,而且打算以後也只放這麼一排,雖然箱子會愈放愈多,但只會放一直線,那麼簡單地說,這就叫一排箱子。用比較宅的術語來形容,稱作一維陣列

如果箱子放好幾排,但只在一個平面上,當沒有箱子會往上疊,都是直接放地上的時候,那麼簡單地說,這就是滿地箱子。用比較宅的術語來形容,這叫做二維陣列

在真實世界裡,你會發現台北的土地貴得嚇人,所以開始把箱子往上疊,每次找要箱子都很麻煩,簡單地說,這就是一堆箱子。用比較宅的術語來形容,稱作三維陣列

在真實世界裡,我想不到還能怎麼堆箱子了?!但在概念上,是可以有N維陣列存在。

沒必要把事情搞得太複雜,在這篇教學只打算告訴你一維及二維陣列該怎麼玩。相較於三維,個人認為三圍還比較有趣些。

給我一個箱子吧

在大賣場買完東西,如果你說「給我一個箱子吧」,服務人員會問你要多大
的箱子,但也可能不問你,就丟了一個箱子給你,反正,就是一個箱子。同樣的情形在電腦的世界裡也是一樣,你告訴系統「給我一個陣列吧」,系統也會問你要多大的陣列,也可能不問你,反正你要的就是一個陣列。

打開GroovyConsole,輸入下面的程式碼(沒錯!我們正打算把List當Array用)。

box = []

這個[]的語法像不像一個箱子?當你執行的時候,系統就會給你一個空箱子。

如果你不想要空箱子,那麼也可以一開始就裝些東西進去。

box = ["香蕉", "蘋果", "芭樂", "蓮霧"]


沒錯,這箱子就是一個水果盒,它真的裝滿水果,有保存期限,不能隨便送往海外,所以要留著自己吃,如果把水果吃掉,裝進新台幣,那就要送到不一樣的地方了。讓我們開始吃水果吧,請玩玩看以下的程式碼,將它貼在上一行程式碼的後方,記住但不用太在意pop()這個語法,它用來將箱子裡最後一個東西"拿出來"。

println "我吃了" + box.pop()
println "我又吃了" + box.pop()
println "我再吃" + box.pop()
println "我還想吃" + box.pop()


執行後,你會看到下圖這樣的結果。


緊接著我們繼續往下增加程式碼,size()用來顯示箱子中還剩下幾樣東西。

println "箱子還剩下" + box.size() + "顆水果"


這一行的輸出結果,當然就是"箱子還剩下0顆水果"。

話說,這個箱子失去水果盒的用途之後,有環保人士認為它不應該當作垃圾丟掉,每個箱子都有它存在的價值,為了讓社會大眾瞭解箱子的存在價值,於是開始將白花花的新台幣現金裝進去,讓我們實地來模擬一下這項作業,繼續往下寫程式碼吧,<<指令很厲害,不管什麼東西都可以把它裝進箱子裡。

box << "一百萬"
box << "一百萬"
box << "一百萬"
println "箱子內總共裝有" + box.size() + "百萬"


就如你的預期,這段程式碼顯示"箱子內總共裝有3百萬"。由於某夫人的指示,認為環保人士把箱子的價值視為三百萬,實在對這個箱子太不公平,至少也要再多加兩百萬,把它裝滿,這樣箱子的存在才有意義阿,為了尊重這位夫人,我們再多放兩百萬進去吧。為了避免被認為我們這樣做是在洗錢,所以我們必須改用其他把錢裝進去的方法,改用push()就可以掩人耳目裝箱成功。

box.push "一百萬"
box.push("一百萬")
println "箱子總共有" + box.size() + "百萬"


括號(...)語法有時候是可以省略地,在上面的範例中我們就省略給你看,今後你就要自己多多嘗試了,所謂師父領進門、修行在個人,不管用在洗錢裝箱或任何事情都一樣。

再來一盒水果

我們已經知道水果盒有五百萬的價值,但它畢竟還是水果盒,我們還是拿來裝水果吧。

box.clear()

這個clear()的指令很恐怖,一執行就把所有現金都變不見了(到底跑哪去了?!)。

box.addAll(["香蕉", "蘋果", "芭樂", "蓮霧"])

水果又裝回來了,addAll可以把另外一個箱子的東西全部倒過來,酷吧!為了幫助雲林古坑的農民們,我決定多裝柳丁。

box.add("柳丁")
println box


已經有五種水果了,對水果盒作println可以看得見。如果想把芭樂換成甘蔗,可以用以下box[2]的語法來指定,但明明芭樂是第三個,為甚麼不寫3卻要寫2呢?原因是Groovy的陣列都是從0開始數。

box[2] = "甘蔗"
println box

如果你不想要蓮霧,可以用remove()這個語法把它丟掉。

box.remove(3)
println box


當然,你可以用box[N]來檢查一下第N+1項是什麼東西,例如想要看目前的第三項,就是用box[2],別忘記用println把結果印出來。

println box[2]


用contains()語法可以檢查水果盒,看看某一種水果是否在裡面,搭配if-else語法來作效果更佳。

if (box.contains("蘋果")) println "有蘋果" else println "沒蘋果"
if (box.contains("蓮霧")) println "有蓮霧" else println "沒蓮霧"


如果我們想知道蘋果在箱子中的哪個位置,則可以用indexOf()這個語法。

println box.indexOf("蘋果")

當然你也可以用indexOf搭配remove來將某個水果找出來,再丟掉。

box.remove(box.indexOf("蘋果"))


多吃水果有益健康,但也不能一次吃太多,所以再來多送一些"真的裝水果"的水果盒給各位,裡面可能包含一些數字,但真的不是"現金",可別對數字太敏感囉。相信經過剛才的練習,動動腦筋就可以看出這些程式碼在玩些什麼把戲,你可在GroovyConsole照著自己的想法改改看,要相信自己的判斷,別相信那些亂爆的料。

box=[
    ["蘋果", 2],
    ["香蕉", 7],
    ["芭樂", 6],
    ["柳丁", 100]
]

println box[1]
println box[1][0]
println box[1][1]

在這個範例中,我們將box宣告成二維陣列,假設這是一個水果攤的庫存管理程式,數字代表庫存量,我們把它印到"Excel"軟體,會更有Fu~今天要免費送給大家的小程式,就是這段將程式執行結果貼到Excel的示範程式碼,非常簡短,當然電腦必須先裝有M$ Office軟體才能跑這段Groovy程式碼囉。

import org.codehaus.groovy.scriptom.*

box=[
    ["蘋果", 2],
    ["香蕉", 7],
    ["芭樂", 6],
    ["柳丁", 100]
]

def xls = new ActiveXObject("Excel.Application")
xls.Visible = true

def workbooks = xls.Workbooks
def workbook  = workbooks.Add()

def sheet = workbook.ActiveSheet
sheet.Range('A1').Value = '水果名稱'
sheet.Range('B1').Value = '數量'

line = 2
box.each {
    item->
    sheet.Range('A'+line).Value = item[0]
    sheet.Range('B'+line).Value = item[1]
    line = line + 1
}
sheet.Range('A'+line).Value = "[小計]"
sheet.Range('B'+line).Formula = "=SUM(B2:B"+(line-1)+")"


以下就是資料貼到Excel之後的畫面,那個[小計]的功能,可是用上Excel的公式(SUM加總函數),不是在程式中計算出來的唷!


為了讓讀者更有「輕鬆玩」的參與感,您可以用網誌的「發表評論」告訴我們,接下來希望我們分享什麼樣的主題和內容,若在教學內容的操作上有任何問題,也可以儘管提出別客氣啊!

* 本文發表於玩物尚誌,《Java輕鬆玩》系列文章的網址為「http://blog.lyhdev.com/search/label/JavaForFun」。版權所有,採用「創用CC授權」條款,歡迎非商業用途之分享與引用,並請保留作者或出處之標示。

4 則留言:

  1. 這一篇真酷,不過有沒有一個可以呼叫程式的列表呢,因為我電腦只有openoffice ~_~ 這個有趣的範例我跑不起來/____________\

    回覆刪除
  2. ok,我用OpenOffice當範例再寫一篇。

    如果是在Windows平台,只要有註冊成元件的軟體都可以用類似的方法呼叫,但是程式碼的操作方式,每個軟體都不一樣,例如Word跟Excel差異就很大了。

    這個系列的教學希望可以做到,用Groovy讓Windows/Linux在處理一些電腦工作的時候,可以自動化進行,也歡迎大家把想到的一些需求告訴我(by 張貼意見),這樣會比較快看到相關的教學囉。

    回覆刪除
  3. 老大好酷,本來只是想在網路上查詢一下陣列的意義到底在哪裡,卻無意中逛來這邊,經過老大精闢的解說,忽然間海闊天空了~

    回覆刪除

lyhcode by lyhcode
歡迎轉載,請務必註明出處!