2012年12月23日 星期日

Google Guava - HashBasedTable

 圖片來源:Table Structure Model

 注意!此為懶人解題法,請小心服用~ (  ̄ c ̄)y·ξ

懶人解題


前幾天在幫朋友寫一個小程式,情境是這樣:
  1. 他們家有一個製作翻譯檔的軟體,(就是一堆表格,在後面填入machine的各國翻譯),填完表格後匯出的翻譯檔格式XML
  2. 資料來源是一個Excel 檔,裡面有記錄所有要翻譯的資料,以及要翻譯成的版本
  3. 任務就是把Excel 的資料轉到XML裡面
如果把XML 的以圖型來表示大概就會像最上面Table Structure Model 的格式一樣,而Excel 的格式卻只是一個一維的Array,檔案格式如下:

A#123  翻譯1 翻譯2
A#423  翻譯1 翻譯2
B#3sj   翻譯1 翻譯2

#代表分隔符號,A 代表某Row 屬性, 123 代表某 Column 屬性,所以要做的工作就是把Excle讀出來,也轉換成Table的方式儲存,然後再把資料填入XML裡面。

問題


對於懶人思考模式來說,會遇到以下問題:
  1. 我利用JAXB 得marshaller 和 unmarshaller 來處理xml,把xml 轉換成物件操作,但是這種xml物件必須用展開/掃描的方式才能找到每一個iteam,所以在使用上不好操作。
所以懶惰的想法就是把Excle 的資料讀出來,做成一個HashMap,然後透過把Xml展開的過程中,把Parent item 和 Child item的attribute ID當做Key值去HashMap取出資料填進去。

但是HashMap 是Key value 型態,如果轉成Table 型態就會變成很噁心的樣子:

HashMap<String,Map<String,String>> = new HashMap<String,Map<String,String>>();
一來不好操作,二來,如果Row 或是Column裡面有更多巢狀結構會更噁心,甚至會一層一層包下去。

懶人解法


這時候我們就請出 Google Guava 的 HashBasedTable ,使用方法非常簡單與直觀,你就想像成在操作一個Table一樣,而他底層的儲存方式其實就是Map<R,Map<C,V>>,只是他幫你處理掉許多麻煩的問題,比如說在傳統的作法,你要儲存某個資料進去前,你比需要先檢查這個Key值對應的Value 存不存在 (在這邊是要檢查Colum Map是否存在),如果不存在要去產生一個放進去。現在有了HashBasedTable,就可以很輕鬆無腦的使用:
table.put(Rkey,CKey,Value)
然後要取出值也很只要寫
table.get(Rkey,CKey,Value)

打好收工~謝謝觀看懶人獻曝~(  ̄ c ̄)y·ξ

張貼留言