有沒有想過,當使用者按下按鈕時,是如何觸發回應視窗,或者是其他動作呢?
一開始我們先記得,在事件處理的過程中,涉及主要下面內容:
1. Event Source(事件源)(Object):事件發生的場所,通常是各個元件,例如按鈕、視窗、選單...等。
2.Event(事件)(Object):當我們對某個元件,做出一些動作時,他會封裝所做的動作相關資訊。
3.Event Listener(事件監聽器)(Object):當有事件源發生事件時(監聽),會對各種事件派送給事件處理器來做相關處理及回應。
4.Event Handler(事件處理器)(Function):當事件監聽器將事件派遣給事件處理器,他會做一連串的回應動作。
參考:細說Java 8 異常處理與圖形介面程式設計 一書
2017年7月12日 星期三
2017年7月6日 星期四
正規表達式(Regular Expression, regex) for Java
--------------------------------------------------------------------------------------------------------------------------
普通字元組
[0-9], \d =>比對數字串
[a-z] =>比對小寫英文字母串
[0-9A-Za-z], \w=>比對數字串
-g =>(global) 全域比對,如果沒家只會比對第一個
-
-
[...] =>代表那些括號內的字元
[^...] =>代表不要那些括號內的字元
+ =>代表出現1次以上
* =>代表出現0次以上
? =>代表出現0次或1次
\n =>換行
\t =>跳格(tab)
\r =>windows中常接著\n一起代表換行(ASCII=0x0c)
\s =>空白型字元
\b =>匹配邊界
. =>代表任何字母(換行除外)
^ =>不在[...]裡面時,代表字串手
$ =>代表字串結尾
(預設)Greedy =>貪婪模式會一直匹配下去,直到無法匹配為止
(?)Reluctant =>勉強模式,只會匹配最少字元。
(+
\X代表不是\x的那些字母
(...) =>代表一個群組
*可以看這個網頁,補充很多知識
https://atedev.wordpress.com/2007/11/23/%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%A4%BA%E5%BC%8F-regular-expression/
--------------------------------------------------------------------------------------------------------------------------
POSIX字元組
--------------------------------------------------------------------------------------------------------------------------
(1).
可以觀看test2檔案執行結果
需找出c或d所在的位置。
而如果要連續
matcher的st
(2).
可以觀看test3檔案執行結果
來看一下+,*,? 和貪婪模式、勉強模式的差別。
(3).
可以觀看test4檔案執行結果
來看一下group的執行結果,其中他會依序尋找其結果
(4)
可以觀看test5檔案執行結果
用一個簡單的例子,試著抓出他的電話號碼
(5)
可以觀看test6檔案執行結果
找出每個句首大寫的單字
(6)
可以觀看test7檔案執行結果
可以利用此程式,知道該號碼為手機、家裡電話、或錯誤號碼
*
http://notes.maxwi.com/2015/10/06/Regex-practice/
* 如果想看更多範例可以到下面網址
http://www.iteye.com/topic/350789
2016年11月15日 星期二
面試問題
今天面試考白版題,整個頭腦轉不過來...就只好回家檢討一下問題了
1.寫出一個反轉字串的方法
2.一樣是反轉字串的方法,但不行使用迴圈的方式
這部分我分兩個...一個是我自己寫的,一個是看網路上比較簡易的==
2.1
2.2
然後需要檢討時間複雜度和空間複雜度的運算和StringBuffer...完全忘記了,這部分下次再補齊
1.寫出一個反轉字串的方法
2.一樣是反轉字串的方法,但不行使用迴圈的方式
這部分我分兩個...一個是我自己寫的,一個是看網路上比較簡易的==
2.1
2.2
然後需要檢討時間複雜度和空間複雜度的運算和StringBuffer...完全忘記了,這部分下次再補齊
補充知識
今天和一個朋友聊天,聊了很多知識東西,我想要把它記下來和補充
1. Override and overload的差別
2. IO dead lock 是什麼, 如何處理?
4. Clean code and dirty code
5. IPv4 Internal IP
6. Agile Scrum
override:子類別繼承父類別的函式,然後改寫其繼承的函式,但必須是函式名稱相同、參數型態個數相同,傳回型態相同。
overload:相同的函式名稱,但參數型態、參數個數、傳回型態只要任一個不同,就會呼叫不同的函數。
process的通常流程=要求資源->使用資源->釋放資源
而dead lock通常要滿足下面條件
a.Mutul exclusion:一個資源(Instances)一次只能被ㄧ 個process使用。
b.Hold and wait:當多個process發生mutul exclusion,然後尋求下一個資源時,都有process在 使用,造成一個等待資源動作出現。
c.No preemption:而資源又不能經過其他方法來釋放,只能依靠使用的process來自行處理。
d.Circular wait:就造成每個process都握有另一個process請求的資源,然後各自沒有釋放本身 持有的資源,造成一個循環出現。
那我們該如何處理
a.完全無視他...反正出現死結機率很低,大不了重開機或重開程式讓他重新來過就好了...
b.偵測死結發生,然後經由自己寫的程式邏輯來恢復運作。
c.使用一個protocol來預防或避免死結發生。
3.繼承、封裝、多型,如何用最普通的講話來解釋?
因為我只會實作,真的沒想過如何用普通的講話說出來,我這裡試著用我想法講出來
這裏我舉一個汽車工廠的例子
當母公司做了一個汽車模組出來分送給底下的子公司,然後子公司依照所待的國家區域,來做調整,例如是顏色問題、燈的明暗度、和左右邊駕駛問題,而這就是「子繼承父」的觀念了。
而封裝就像是避免存取一些你不想讓人知道的東西,舉個例子來說,每個汽車裡都有一個微電腦,而開發汽車微電腦的人,不想有人亂動裡面機密的設定,避免造成車禍事件發生,所以他們就只提供,供應微電腦的電源連接器、微電腦輸出設定到儀表板上,而微電腦就是被封裝的東西,而電源連接器和輸出設定就是提供微電腦的介面方法。
多型,我就在繼承的例子,再改一下,當母公司做了一個汽車模組設計圖,而這個汽車模組設計圖依照各個國家、地區、氣候、政治的不同,有不同的設計成品出來,而這些設計成品的原型是從「同一個名稱的汽車模組設計圖」出來的。
dirty code指的是讓人覺得很難看得懂的程式,有可能是重複宣告、同樣的程式碼、髒亂的排版、沒有註解...等等,而會造成這個原因有可能是自身實力不足或者是為圖方便之類,從而造成程式碼越來越髒、當越髒時Bug也會越多,因為當你看不懂時就會亂改參數或者是重新寫一個新的,而通常這都會造成下一個問題出現,因為你看不懂程式碼,無法全面觀察改變之後會造成什麼事情出現,而clean code就是除去這些問題所寫的完美程式碼,我這裡推薦兩個網址,這裡詳述一些dirty code的問題。
http://www.ithome.com.tw/node/83209
http://keystonegame.pixnet.net/blog/post/17243817-%E7%A8%8B%E5%BC%8F%E7%A2%BC%E5%A3%9E%E5%91%B3%E9%81%93(code-bad-smell)
參考資料:
http://sls.weco.net/node/21327
http://www.ithome.com.tw/node/83209
http://keystonegame.pixnet.net/blog/post/17243817-%E7%A8%8B%E5%BC%8F%E7%A2%BC%E5%A3%9E%E5%91%B3%E9%81%93(code-bad-smell)
https://toggl.com/developer-methods-infographic
2016年10月11日 星期二
C/C++ call by value, call by address, call by reference
標頭都加上
#include <iostream >
using namespace std ;
然後使用dev c++
==============================================
int main( )
{
int i=1;
cout << i <<endl; // print 1
}
==============================================
int main( )
{
int i=1;
cout << &i <<endl; // print i address
}
==============================================
int main( )
{
int i=1;
int &j=i; //讓j的位址指向i的位址( 兩個位址會一樣)
cout << j << endl; //print j values (That is i values)
cout << &j << endl; // print j address (That is i address)
}
==============================================
int main( )
{
int i=1;
int *k=&i; //讓k的變數參照i的位址( 兩個位址會不一樣)
cout << k << endl; // print k values => i address (所以k變數數值列印出來是i的位址)
cout << &k << endl; // print k address (是指k的位址, 不關變數i的事情)
cout << *k << endl; // print i address pointer values (指的是, k指標變數所參照i位址的數值)
}
=============================================
#include <
然後使用dev c++
==============================================
{
}
==============================================
{
}
==============================================
{
}
==============================================
{
}
=============================================
2016年10月7日 星期五
eclipse java project 應用於XAMPP MySQL
因為我是第一次用jdbc,所以就在這記錄一些事情
首先下載mysql-connector-java -XXXX-bin. jar
download link:http://dev.mysql.com/downloads/connector/j/
然後add external jars, 把jar檔放入
之後試著寫一段程式連接
會發現出現一個錯誤
ClassNotFoundException: java . lang . ClassNotFoundException: com . mysql. jdbc . Driver
是因為MYSQL 預設是不允許通過遠端存取資料庫
所以必須在mysql command下指令:
1.改表
use mysql;
select user, host, password from user;
update user set host='%' where user='root';
2.授權法
grant all privileges on *. * to 'myuser'@'%' identified by 'mypassword ' with grant option;
或者是特定主機才可以連線
grant all privileges on *. * to 'myuser'@'192. 168.1.3' identified by 'mypassword ' with grant option;
然後重開mysql,之後就能成功存取了
再來下面是實作結果
reference :
https://blog.yslifes.com/archives/918
https://my.oschina.net/weiweiblog/blog/664373
首先下載mysql-connector-
然後add external jars
之後試著寫一段程式連接
會發現出現一個錯誤
ClassNotFoundException
是因為MYSQL 預設是不允許通過遠端存取資料庫
所以必須在mysql command下指令:
1.改表
2.授權法
或者是特定主機才可以連線
然後重開mysql,之後就能成功存取了
再來下面是實作結果
https://blog.yslifes.com/archives/918
https://my.oschina.net/weiweiblog/blog/664373
2016年9月30日 星期五
Java 關於ArrayList 深度複製
自從學會ArrayList泛型使用,我就開始愛上他來做陣列使用。
簡單的泛型使用類似下面code,第一段是簡單的int泛型,第二段是int[]的陣列。
然後ArrayList也能使用物件來當參數,例如下面:
ArrayList使用容易,也很好分辨
如果你要複製一樣的ArrayList,可以用以下的式子
但是,如果你是使用ArrayList<陣列 or 物件>,你就要特別小心了
例如下面
可以發現到當arrayList改變時,arrayListCopy數值也會跟著改變,是因為ArrayList是淺度複製,當參數是單純變數時(例:int, String, boolean),複製的arrayListCopy不會改變,但當參數是陣列 or 物件,ArrayList<int[]> arrayListCopy=new ArrayList<int[]>(arrayList); arrayListCopy 和 arrayList指向的是同一個記憶體位置,所以會造成某個ArrayList改變時,另一個就會跟著改變。
而如果要簡單解決這問題的話,只要做下面的方法就行了:
ArrayList<int[]> arrayListCopy=new ArrayList<int[]>(arrayList);
改成
for ( int [ ] copy: arrayList )
arrayListCopy . add( copy. clone( ));
簡單的泛型使用類似下面code,第一段是簡單的int泛型,第二段是int[]的陣列。
然後ArrayList也能使用物件來當參數,例如下面:
ArrayList使用容易,也很好分辨
如果你要複製一樣的ArrayList,可以用以下的式子
但是,如果你是使用ArrayList<陣列 or 物件>,你就要特別小心了
例如下面
可以發現到當arrayList改變時,arrayListCopy數值也會跟著改變,是因為ArrayList是淺度複製,當參數是單純變數時(例:int, String, boolean),複製的arrayListCopy不會改變,但當參數是陣列 or 物件,ArrayList<int[]> arrayListCopy=new ArrayList<int[]>(arrayList); arrayListCopy 和 arrayList指向的是同一個記憶體位置,所以會造成某個ArrayList改變時,另一個就會跟著改變。
而如果要簡單解決這問題的話,只要做下面的方法就行了:
ArrayList<int[]> arrayListCopy=new ArrayList<int[]>(arrayList);
改成
ArrayList<int[]> arrayListCopy=new ArrayList<int[]>();
{
}
一個一個陣列把他複製下來。
也可以使用 BeanUtils.cloneBean來把它複製。
訂閱:
文章 (Atom)

