要考研究所,加上又是資結組的,所以無聊就來寫個.....二元搜尋樹的刪除吧
因為在書上都沒看過這類的實做,所以就實做一個吧
在刪除Binary Search Tree的某節點時,如果刪除的是樹葉節點 (Leaf) 就直接刪除
如果為非樹葉結點時 (non-Leaf) 時,就須以該刪除點為基準以左子數最大或是右子樹最小取代
以下程式的實作中,我統一以左子樹中最大的來取代刪除的點
在製作過程中較困難也最重要的是如果刪除該點後以左子樹最大取代
取代被刪除的點之後,左子樹最大的點及其父親節點和其而子結點該如何處理?
左圖為以下程式範例所建立的二元搜尋樹
以刪除20為例,程式會以左邊最大的節點15
去代 20。
2010年12月21日 星期二
2010年12月16日 星期四
十六進制轉八進制使用 C#
16進制轉成8進制,可以透過C# 的內建函數解決 Convert.toString()
如果想要實做的話就先了解如何轉換,首先 16 進制顧名思義就是遇到16就進位
所以可以表示的範圍為1 ~ 15, 但是10 ~ 15 以 A ~ F 取代
以下範例 先將 16 轉成 2 進制 > 針對每個16進制的數字 拆解成4個位元以表示2進制
F > 1111 , 8 > 1000
最後再將 2 進制轉成 8 進制 > 針對二進位中從尾巴開始數每三個數字及組合成一個8進制數字
如果不足及補零
10101100 每三個分隔 > 10|101|100 > 不足則補零 > 010|101|100 > 轉8進制 > 254
以下為程式實做
如果想要實做的話就先了解如何轉換,首先 16 進制顧名思義就是遇到16就進位
所以可以表示的範圍為1 ~ 15, 但是10 ~ 15 以 A ~ F 取代
以下範例 先將 16 轉成 2 進制 > 針對每個16進制的數字 拆解成4個位元以表示2進制
F > 1111 , 8 > 1000
最後再將 2 進制轉成 8 進制 > 針對二進位中從尾巴開始數每三個數字及組合成一個8進制數字
如果不足及補零
10101100 每三個分隔 > 10|101|100 > 不足則補零 > 010|101|100 > 轉8進制 > 254
以下為程式實做
2010年12月15日 星期三
2010年12月11日 星期六
Java 程式 - 螺旋矩陣
2010年12月9日 星期四
JSP 教學 - 檔案下載
關於檔案下載,以下就直接以一個範例來下載一個檔案
當然這只是個最簡單的範例,其餘應用就靠各位自己發揮吧
首先在 JSP 或 HTML 可以用一個連結或是 form 請求後進入後台處理
以下為我以 C 槽的檔案進行下載
當然這只是個最簡單的範例,其餘應用就靠各位自己發揮吧
首先在 JSP 或 HTML 可以用一個連結或是 form 請求後進入後台處理
以下為我以 C 槽的檔案進行下載
package fsc.regLogIdent.controller;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class getFile extends HttpServlet
{
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
java.io.File file = new java.io.File("C:\\bike_up.jpg"); //建立需下載檔案的 File 物件
long length = file.length(); //取出該檔案長度
java.io.FileInputStream fi = new java.io.FileInputStream(file); //建立該檔案的輸入串流
//取得客戶端的輸出流, 這邊以 OutputStream 為輸入串流的物件
java.io.OutputStream os = response.getOutputStream();
//設定 response 封包中的標頭
response.setHeader("Content-Disposition", "attachment; filename=" + "bike_up.jpg");
//設定欲下載檔案的 ContentType
response.setContentType("image/jpeg");
//設定該檔案的長度
response.setHeader("Content_Length", Long.toString(length));
int r = 0;
//將檔案讀入 FileInputStream 並寫入 OutputStream
while((r = fi.read()) != -1)
{
os.write(r);
}
os.close();
fi.close();
}
}
2010年12月4日 星期六
JSP 教學 - 多檔上傳
前一篇介紹了檔案上傳,但是只能一次上傳一個檔案
而且做法是簡單說就是邊讀傳流的資料邊判斷編寫入,過程其實不好控制,也複雜
更重要的是也很難實現多檔上傳,所以那個方法並非非常理想,但也是個選擇
而這篇介紹的多檔上傳就是一次把串流的資料讀完再去做分檔即寫入的動作
還記得上傳的本文內容吧,以下來看看如果是多檔上傳時他的本文內容是啥樣子
------WebKitFormBoundaryGq7bBR8Pb4HYPKfp
Content-Disposition: form-data; name="uploadFile"; filename="m.txt"
Content-Type: text/plain
內容一內容一內容一內容一
------WebKitFormBoundaryGq7bBR8Pb4HYPKfp
Content-Disposition: form-data; name="uploadFile"; filename="m1.txt"
Content-Type: text/plain
內容二內容二內容二內容二
------WebKitFormBoundaryGq7bBR8Pb4HYPKfp--
而且做法是簡單說就是邊讀傳流的資料邊判斷編寫入,過程其實不好控制,也複雜
更重要的是也很難實現多檔上傳,所以那個方法並非非常理想,但也是個選擇
而這篇介紹的多檔上傳就是一次把串流的資料讀完再去做分檔即寫入的動作
還記得上傳的本文內容吧,以下來看看如果是多檔上傳時他的本文內容是啥樣子
------WebKitFormBoundaryGq7bBR8Pb4HYPKfp
Content-Disposition: form-data; name="uploadFile"; filename="m.txt"
Content-Type: text/plain
內容一內容一內容一內容一
------WebKitFormBoundaryGq7bBR8Pb4HYPKfp
Content-Disposition: form-data; name="uploadFile"; filename="m1.txt"
Content-Type: text/plain
內容二內容二內容二內容二
------WebKitFormBoundaryGq7bBR8Pb4HYPKfp--
2010年11月28日 星期日
JSP 教學 - 檔案上傳
檔案上傳廣泛運用在網路硬碟上,提供使用者一個空間儲存資料,接下來介紹一下檔案上傳的一些關鍵點
首先是 HTML 的部份,通常都會用一個 form 來執行,而讓使用者選擇檔案的標籤則是 input type="file",看看底下的HTML片段吧
<form action="/regLogIdent/upload.do"method="post"
enctype="multipart/form-data" >
<input type="file" name="uploadFile" />
<input type="submit" value="submit" />
</form>
以上的 form 標籤中有一個要點即是 enctype="multipart/form-data",這是上傳文件時須加載的屬性,所以 form 送出請求時的封包格式會有些差異
以下來看看上傳檔案時封包所顯示的格式,以下為程式片斷,觀察封包的標頭及值
//透過 HttpServletRequest 的 getHeaderNames() 取得所有標頭,注意型態為 Enumeration
Enumeration e = request.getHeaderNames();
while(e.hasMoreElements()){
String headername = (String)e.nextElement(); //取得標頭
out.println(headername + " : " +
request.getHeader(headername) + "<br />");//用 getHeader(String headerName) 取得該標頭值
}
首先是 HTML 的部份,通常都會用一個 form 來執行,而讓使用者選擇檔案的標籤則是 input type="file",看看底下的HTML片段吧
<form action="/regLogIdent/upload.do"method="post"
enctype="multipart/form-data" >
<input type="file" name="uploadFile" />
<input type="submit" value="submit" />
</form>
以上的 form 標籤中有一個要點即是 enctype="multipart/form-data",這是上傳文件時須加載的屬性,所以 form 送出請求時的封包格式會有些差異
以下來看看上傳檔案時封包所顯示的格式,以下為程式片斷,觀察封包的標頭及值
//透過 HttpServletRequest 的 getHeaderNames() 取得所有標頭,注意型態為 Enumeration
Enumeration e = request.getHeaderNames();
while(e.hasMoreElements()){
String headername = (String)e.nextElement(); //取得標頭
out.println(headername + " : " +
request.getHeader(headername) + "<br />");//用 getHeader(String headerName) 取得該標頭值
}
2010年11月21日 星期日
JSP 教學 - PreparedStatement 的使用
在一般的 Java 程式裡如果要插入一筆資料到資料表中,最基本的方法都是用 java.sql.Statement 去做,譬如:
Statement state = connection.createStatement();
state.executeUpdate("SQL 語法");
通常上面的 SQL 語法會寫的太凌亂,譬如太多的單引號和雙引號交錯導致可讀性不易,例如
state.executeQuery("INSERT INTO temp(account, user, password) VALUES('" + account + "','" + username + "','" + password + "')"); //以上的三個變數都為字串
以上有個替代方法就是利用 java.sql.PreparedStatement
可以很簡單的表示成以下
String sql = "INSERT INTO temp(account, user, password) VALUES(?, ? ,?)";
PreparedStatement prestate = connection.prepareStatement(sql); //先建立一個 SQL 語句並回傳一個 PreparedStatement 物件
prestate.setString(1, account); //對應到第一個問號
prestate.setString(2, user); //對應到第二個問號
Statement state = connection.createStatement();
state.executeUpdate("SQL 語法");
通常上面的 SQL 語法會寫的太凌亂,譬如太多的單引號和雙引號交錯導致可讀性不易,例如
state.executeQuery("INSERT INTO temp(account, user, password) VALUES('" + account + "','" + username + "','" + password + "')"); //以上的三個變數都為字串
以上有個替代方法就是利用 java.sql.PreparedStatement
可以很簡單的表示成以下
String sql = "INSERT INTO temp(account, user, password) VALUES(?, ? ,?)";
PreparedStatement prestate = connection.prepareStatement(sql); //先建立一個 SQL 語句並回傳一個 PreparedStatement 物件
prestate.setString(1, account); //對應到第一個問號
prestate.setString(2, user); //對應到第二個問號
2010年11月15日 星期一
JSP 教學 - JavaMail 電子郵件處理
我們可以透過 JavaMail API 來進行電子郵件的處理,首先必須先去下載 JavaMail 套件
可以到 http://www.oracle.com/technetwork/java/javamail-1-4-2-141075.html
下載最新的 JavaMail 1.4.2 API ,可以選擇下載壓縮檔,下載完成並解壓縮後
我們需要的是 mail.jar 即可,如果需要處理附加檔案的話則還要另外下載
JavaBeans Activation Framework(JAF)來配合 JavaMail
接下來介紹一下 JavaMail 的用途,在寫 JSP 的登入的時候如果使用者忘記密碼
那就是用到 JavaMail 的時候了,我以 NetBeans 為例實現寄送電子郵件的功能
首先將剛剛下載的 mail.jar 匯入到 project 中,在側邊欄的 Liberaries 點擊右鍵 > Add Library
接下來可以在一個 Servlet 中進行郵件處理,在這之前可能需要先讓使用者
可以到 http://www.oracle.com/technetwork/java/javamail-1-4-2-141075.html
下載最新的 JavaMail 1.4.2 API ,可以選擇下載壓縮檔,下載完成並解壓縮後
我們需要的是 mail.jar 即可,如果需要處理附加檔案的話則還要另外下載
JavaBeans Activation Framework(JAF)來配合 JavaMail
接下來介紹一下 JavaMail 的用途,在寫 JSP 的登入的時候如果使用者忘記密碼
那就是用到 JavaMail 的時候了,我以 NetBeans 為例實現寄送電子郵件的功能
首先將剛剛下載的 mail.jar 匯入到 project 中,在側邊欄的 Liberaries 點擊右鍵 > Add Library
接下來可以在一個 Servlet 中進行郵件處理,在這之前可能需要先讓使用者
2010年11月13日 星期六
JSP 教學 - 圖文驗証碼製作
概述:在登入或是註冊的時候加上驗證碼,可以防止有心人批量的註冊或登入或是到取別人的
帳密。
圖形驗證碼的製作以 Java 2D 為基礎,透過 Servlet 動態產生驗證碼。
這邊作法有兩種,一種是已經事先產生好大量的驗證碼再去隨機取一張,另一種是如上述的方法
動態產生一張圖形驗證碼,這樣是比較安全的狀況,如果把驗證的圖放在某目錄下又沒加以保護
很容易讓人直接以URL取得你的所有圖檔,
以 Xuite 為例就是如此,在我這製作專題的過程中就是碰到類似問題幸好.....Xuite 不是動態產生,不然專題早掛摟....
首先先配置一個 Servlet 吧,以下為 SignalPage.java
帳密。
圖形驗證碼的製作以 Java 2D 為基礎,透過 Servlet 動態產生驗證碼。
這邊作法有兩種,一種是已經事先產生好大量的驗證碼再去隨機取一張,另一種是如上述的方法
動態產生一張圖形驗證碼,這樣是比較安全的狀況,如果把驗證的圖放在某目錄下又沒加以保護
很容易讓人直接以URL取得你的所有圖檔,
以 Xuite 為例就是如此,在我這製作專題的過程中就是碰到類似問題幸好.....Xuite 不是動態產生,不然專題早掛摟....
首先先配置一個 Servlet 吧,以下為 SignalPage.java
訂閱:
文章 (Atom)


