JAVA
JAVA的UTF-8 繁簡互轉的方法
首先 要先感謝來自PTT JAVA版的 ClareQ (人比人Cheese人)
他的方法讓我大開眼界,比我上一篇使用replace 的方法更為快速,他使用了 hashmap
也感謝他允許我發了這篇文章
public class Encoding {
	public Encoding() {
	}
	public String StoT(String data) {
		return translate(data, S2T);
	}
	public String TtoS(String data) {
		return translate(data, T2S);
	}
	private static final Map T2S = new HashMap();
	private static final Map S2T = new HashMap();
	static {
                final char[] UTF8T ="繁體字表...".toCharArray();
                final char[] UTF8S ="簡體字表...".toCharArray();
                for (int i = 0, n = Math.min(UTF8T.length, UTF8S.length); i < n; i++) {
			final Character cT = Character.valueOf(UTF8T[i]);
			final Character cS = Character.valueOf(UTF8S[i]);
			T2S.put(cT, cS);
			S2T.put(cS, cT);
		}
	}
	private static String translate(String text,
			Map dictionary) {
		final char[] chars = text.toCharArray();
		for (int i = 0, n = chars.length; i < n; i++) {
			final Character found = dictionary.get(chars[i]);
			if (null != found)
				chars[i] = found;
		}
		return String.valueOf(chars);
	}
   
其中繁體字跟簡體字字字表,後面附上,因為大約有兩千五百字…..
他的方法和我以前的想法不一樣,因為我只是換字,不是換詞,所以他把字串拆開成陣列後,把文章帶進字碼表去搜尋,大概是hashmap 在這方面的高效率,所以可以快速提升執行效率
這是和上一篇同樣的樣本做的測試
總共花費 96089.0ms ;其中下載花費95658.0ms 資料處理花費 431.0ms
效率大概是使用JAVA 內建的replace()的80倍
看來我現在是要想辦法提高下載效率
JAVA提高String.replace() 執行速度的方法
繼續上一篇的內容,為了這些問題,我詢問了PTT 的 JAVA版,也很感謝有人替我解答,並教我如何提高replace 的效率
參考資料 https://www.facebook.com/java.tw 的 5月8日的文章
這個方法經過測試,應該可以使用正規表示式,但我測試的次數不夠多,也不保證其效率 <-免責聲明XD
簡單來說 就是 JAVA 官方提供的 String 中的 replace() 把所有的任務都當成正規表示式來處理,所以效率不彰,而如果我們只是要做單純的文字置換,顯然不需要那些步驟。
以下是程式碼+口語化只有我自己懂得演算法
public class Replace {
	public Replace() {
		// TODO Auto-generated constructor stub
	}
	public static String replace(String str, String patten, String replacement) {
		// str 要置換的字串 把patten換成 replacement
		int pos = str.indexOf(patten);
		return pos < 0 ? str : _replace(str, patten, replacement, pos);
	}
/**演算法說明
 * 
 * @param str 資料
 * @param patten 要換掉的文字
 * @param replacement 要改成的文字
 * @param pos 那段文字在哪
 * @return 
 * 1. 從頭開始找出符合的字串,並且標示第幾個字放進pos
 * 2. 先把在pos前面的字放進結果區(newContent)
 * 3. 再放進replacement
 * 4. 再去找下一個字的位置放進pos 
 * 5. 接續步驟三直到全部找完為止
 */
	public static String _replace(String str, String patten,
			String replacement, int pos) {
		int len = str.length();
		int plen = patten.length();
		StringBuilder newContent = new StringBuilder(len);
		int lastPos = 0;
		do {
			newContent.append(str, lastPos, pos);
			newContent.append(replacement);
			lastPos = pos + plen;
			pos = str.indexOf(patten, lastPos);
		} while (pos > 0);
		newContent.append(str, lastPos, len);
		return newContent.toString();
	}
}
經過我在小說下載器上的實際測試結果
效率提高的8倍左右
以下是測試數據,以一部124頁的小說當作測試樣本
使用String.repalce() :總共花費 112890.0ms ;其中下載花費80601.0ms 資料處理花費 32289.0ms
使用新的方法 :總共花費 71188.0ms ;其中下載花費67008.0ms 資料處理花費 4180.0 ms
下載花費時間取決於測試當下的網路狀況
JAVA 的字串替換
參考資料
http://satellite.iteye.com/blog/224820
http://lbs.iteye.com/blog/208056
http://hehome.blogspot.tw/2011/06/java.html
最近為了我的小說下載器,找了很多相關的資料
首先 String 的 replace() 和 replaceAll()的差別
這兩個都是做string 大量置換,只是 replace() 就只是單純的置換,而replaceAll() 支援 使用正規表示式
以下是例子(抱歉引用了 參考文章的)
         
        String src = new String("ab43a2c43d");
        System.out.println(src.replace("3","f"));=>ab4f2c4fd.
        System.out.println(src.replace('3','f'));=>ab4f2c4fd.
        System.out.println(src.replaceAll("\\d","f"));=>abffafcffd.
        System.out.println(src.replaceAll("a","f"));=>fb43fc23d.
        System.out.println(src.replaceFirst("\\d,"f"));=>abf32c43d
        System.out.println(src.replaceFirst("4","h"));=>abh32c43d. .
再來就是 另一種 使用 正規表示式的 大規模置換的方法,下面的範例是用來 過濾所有的HTML 的
 
          java.util.regex.Pattern p_html;
          java.util.regex.Matcher m_html; 
          String regEx_html = "<[^>]+>"; //定義HTML標籤的正則表達式 
          p_html = Pattern.compile(regEx_html,Pattern.CASE_INSENSITIVE);
          m_html = p_html.matcher(htmlStr);
          htmlStr = m_html.replaceAll(""); //過濾html標籤 
我剛剛理解了 兩者之間的差別
前者的作法,每次都要重新分析一次正規表示式,而後者可以指分析一次就重複使用
物件導向與效能之間的抉擇
可能是作業專題的關係,很久沒碰C了
寫了一學期的JAVA,發現JAVA的寫作方式真的很方便,雖然我還是不太會物件化
但是已經漸漸地感受到他的方便
然而當執行程式的硬體從CPU強大的電腦改成 手機時….
就會發現一個很嚴重的問題
就是 "速度"
以前我們總是不會去在意那一點點
然而 許多一點點,就變成一大點
物件導向雖然讓每次寫程式的時候 思考變簡單,處理BUG 變簡單
但是相對的,會用到大量的 JUMP 跳躍在美的物件間
無形中 浪費了許多CPU 時間…..
尤其是一些物件的function 可能只有兩三行,那浪費的比例就更大了
這次的專題我開始碰到這個問題了…..所以…為了速度0….我捨去了一些物件導向的原則….




