锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 浣滆咃細Jeff 鍙戣〃浜庯細2006-12-02 08:12 鏈鍚庢洿鏂頒簬錛?2007騫?2鏈?1鏃?23:10 /** import org.junit.Assert; import chinese.utility.ChineseNumber; public class ChinesNumberFormatter { /** /** /** } } 嫻嬭瘯 /** public class ChineseNumber { private static final int RADIX = 10; private static final String[] LOWER_UNIT = { "", "鍗?, "鐧?, "鍗?, "涓?, "鍗?, private static final String[] UPPER_UNIT = { "", "鎷?, "浣?, "浠?, "涓?, "鎷?, private int number; public ChineseNumber(int number, boolean isShort) { public ChineseNumber(int number) { public String lower() { if (abbreviation == true && canAbbreviate(number)) { int leftNumber = number; if (currentNumber > 0) { if (bit % 4 == 0 && currentNumber == 0) { bit++; return result; } /** /** } 浣滆咃細Jeff 鍙戣〃浜庯細2007騫?2鏈?1鏃?11:27 鏈鍚庢洿鏂頒簬錛?2007騫?2鏈?1鏃?12:38 鍦↗ava涓紝瀵逛竴涓暟緇勬垨鍒楄〃(鍦ㄦ湰鏂囦腑緇熺О涓洪泦鍚?涓殑鍏冪礌鎺掑簭錛屾槸涓涓緢緇忓父鐨勪簨鎯呫傚ソ鍦⊿un鍏徃鍦↗ava搴撲腑瀹炵幇浜嗗ぇ閮ㄥ垎鍔熻兘銆傚鏋滈泦鍚堜腑鐨勫厓绱犲疄鐜頒簡Comparable鎺ュ彛錛岃皟鐢ㄤ互涓嬬殑闈欐?static)鏂規硶錛屽氨鍙互鐩存帴瀵歸泦鍚堟帓搴忋?/p> // 鏁扮粍鎺掑簭鏂規硶 // 鍒楄〃 浠ヤ笂鐨勮繖浜涙帓搴忔柟寮忚兘婊¤凍澶ч儴鍒嗗簲鐢ㄣ備絾闆嗗悎涓殑鍏冪礌娌℃湁瀹炵幇Comparable鎺ュ彛錛屾垨鑰呴泦鍚堜腑鐨勫厓绱犺鎸変竴縐嶇壒鍒殑鏂瑰紡鎺掑簭錛岃繖瑕佹庝箞鍔烇紵Sun鍏徃鏃╁氨鎯沖埌浜嗭紝騫跺湪Java搴撲腑鎻愪緵涓婇潰涓や釜鏂規硶鐨勯噸杞姐?/p> // 鏁扮粍鎺掑簭鏂規硶銆?br>// 鏁扮粍涓殑鍏冪礌鍙互鏄儚int榪欐牱鐨勫師鐢熺被鍨?primitive type), 涔熷彲浠ユ槸鍍廠tring榪欐牱瀹炵幇浜咰omparable鎺ュ彛鐨勭被鍨嬶紝榪欓噷鐢╰ype琛ㄧず銆? // 鍒楄〃 鍙瀹炵幇浜咰omparator鎺ュ彛錛屽氨鍙互鎸夌▼搴忓憳鑷繁鐨勬剰鎬濆幓鎺掑簭浜嗐傚浜庡寘鍚眽瀛楃殑瀛楃涓叉潵璇達紝鎺掑簭鐨勬柟寮忎富瑕佹湁涓ょ錛氫竴縐嶆槸鎷奸煶錛屼竴縐嶆槸絎旂敾銆傛眽瀛楁槸閫氳繃涓瀹氱殑緙栫爜鏂瑰紡瀛樺偍鍦ㄨ綆楁満涓婄殑錛屼富瑕佺殑緙栫爜鏈夛細Unicdoe銆丟B2312鍜孏BK絳夈?/p> Unicode涓紪鐮佽〃鍒嗕負涓ゅ潡錛屼竴涓槸鍩烘湰鐨勶紝涓涓槸杈呭姪鐨勩傜幇鍦ㄧ殑澶у鏁版搷浣滅郴緇熻繕涓嶆敮鎸乁nicode涓緟鍔╁尯鍩熶腑鐨勬枃瀛楋紝濡俉inXp銆?/p> 鍦↗ava涓殑瀛楃灝辨槸Unicode鐮佽〃紺虹殑銆傚浜嶶nicode鍩烘湰鍖哄煙涓殑鏂囧瓧錛岀敤涓や釜瀛楄妭鐨勫唴瀛樺瓨鍌紝鐢ㄤ竴涓猚har琛ㄧず錛岃岃緟鍔╁尯鍩熶腑鐨勬枃瀛楃敤4涓瓧鑺傚瓨鍌紝鍥犳杈呭姪鍖哄煙涓殑灝辮鐢ㄤ袱涓猚har鏉ヨ〃紺轟簡(琛ㄤ竴縐嶈摑鑹插簳灝辨槸杈呭姪鍖哄煙涓殑鏂囧瓧)銆備竴涓枃瀛楃殑unicode緙栫爜錛屽湪Java涓粺涓鐢╟odePoint(浠g爜鐐?榪欎釜姒傚康銆?/p> 涓枃鍜屾棩鏂囥侀煩鏂囦竴鏍鋒槸琛ㄦ剰鏂囧瓧錛屽湪Unicode涓紝涓棩闊╀笁鍥?涓滀簹鍦板尯)鐨勬枃瀛楁槸緇熶竴緙栫爜鐨勩侰JK浠h〃鐨勫氨鏄腑鏃ラ煩銆傚湪榪欓噷錛屾垜鎶婅繖3涓枃瀛楋紝閮戒綔涓烘眽瀛楀鐞嗕簡銆?鏃ヨ鍜岄煩璇彲鑳藉氨鏄粠姹夎涓鐢熺殑鍚э紒) 姹夊瓧鍦║nicode涓殑鍒嗗竷澶ц嚧濡備笅琛細 鍦ㄨ繖浜涚紪鐮佸尯闂達紝鏈変簺緙栫爜鏄繚鐣欑殑銆?/p> GB2312鏄腑鍗庝漢姘戝叡鍜屽浗鏈鏃╃殑璁$畻鏈烘眽瀛楃紪鐮佹柟寮忋傚ぇ姒傛湁6000澶氫釜姹夊瓧錛岃繖浜涙眽瀛楁槸鎸夋嫾闊抽『搴忕紪鐮佺殑銆傝繖6000澶氫釜姹夊瓧閮芥槸綆浣撲腑鏂囧瓧銆?/p> GB2312鐨勬墿灞曪紝騫跺吋瀹笹B2312銆傛墿灞曞悗鐨勬眽瀛楀ぇ姒傛湁2涓囧涓紝鍏朵腑鏈夌畝浣撴眽瀛椾篃鏈夌箒浣撴眽瀛椼?/p> 鎷奸煶鏈夊ソ鍑犵鏂瑰紡錛屽叾涓渶涓昏鐨勬槸涓崕浜烘皯鍏卞拰鍥界殑姹夎鎷奸煶 Chinese Phonetic銆傚姹夊瓧鐨勬帓搴忔湁涓ょ錛氫竴縐嶆槸瀹芥澗鐨勶紝鑳藉鎸夋嫾闊蟲帓搴忔渶甯哥敤鐨勬眽瀛楋紝鍙︿竴縐嶆槸涓ユ牸鐨勶紝鑳藉鎸夋嫾闊蟲帓搴忕粷澶ч儴鍒嗗ぇ閮ㄥ垎姹夊瓧銆?/p> 鍘熺悊錛氭眽瀛楁渶鏃╂槸GB2312緙栫爜錛屾敹褰曚簡鍏崈澶氫釜姹夊瓧錛屾槸鎸夋嫾闊蟲帓搴忕殑錛岀紪鐮佹槸榪炵畫鐨勩?鍚庢潵鍑虹幇浜咷BK緙栫爜錛屽GB2312榪涜浜嗘墿灞曪紝鍒頒簡涓や竾澶氭眽瀛楋紝騫朵笖鍏煎GB2312錛屼篃灝辨槸璇碐B2312涓殑姹夊瓧緙栫爜鏄師灝佷笉鍔ㄦ惉鍒癎BK涓殑(鍦℅BK緙栫爜涓璠B0-D7]鍖轟腑)銆?/p> 濡傛灉鎴戜滑鍙叧蹇冭繖6000澶氫釜姹夊瓧鐨勯『搴忥紝灝卞彲浠ョ敤涓嬮潰鐨勬柟娉曞疄鐜版眽瀛楀鏉炬帓搴忋?/p> /** package chinese.utility; import java.text.Collator; public class PinyinSimpleComparator implements Comparator<String> { 鍦ㄥ[瀛? 瀛? 瀹? 灝? 寤? 寮? 寰? 鏄? 鏇? 鏇?鎬榪欏嚑涓眽瀛楁帓搴忥紝緇撴灉鏄細[鏇? 鏄? 寤? 瀛? 瀹? 瀛? 寰? 灝? 鏇? 寮? 鎬銆傛渶鍚庝竴涓?strong> 鎬?/strong> 鏈夐棶棰橈紝涓嶈鎺掑湪鏈鍚庣殑銆? 娉ㄦ剰錛氳繖涓▼搴忔湁涓や釜涓嶈凍 涓嬮潰鐨勬祴璇曚唬鐮佸彲浠ヨ瘉鏄?/p> /** /** 涓轟簡瑙e喅瀹芥澗鐨勬嫾闊崇殑涓ょ偣涓嶈凍錛屽彲浠ラ氳繃瀹炵幇姹夎鎷奸煶鐨勫嚱鏁版潵瑙e喅銆俫oolge涓嬬湅鍒皊f涓婃湁涓猵inyin4j鐨勯」鐩紝鍙互瑙e喅榪欎釜闂錛宲inyin4j鐨勯」鐩湴鍧鏄細http://pinyin4j.sourceforge.net/銆?/p> 瀹炵幇浠g爜錛?/p> /** import java.util.Comparator; public class PinyinComparator implements Comparator<String> { public int compare(String o1, String o2) { for (int i = 0; i < o1.length() && i < o2.length(); i++) { int codePoint1 = o1.charAt(i); if (Character.isSupplementaryCodePoint(codePoint1) if (codePoint1 != codePoint2) { String pinyin1 = pinyin((char) codePoint1); if (pinyin1 != null && pinyin2 != null) { // 涓や釜瀛楃閮芥槸姹夊瓧 /** 嫻嬭瘯錛?/p> /** import java.util.Comparator; import org.junit.Assert; import chinese.utility.PinyinComparator; public class PinyinComparatorTest { private Comparator<String> comparator = new PinyinComparator(); /** /** /** /** /** /** } 鎴戠殑榪欐牱涓ユ牸鐨勬嫾闊蟲帓搴忚繕鏄湁鏈夊緟鏀硅繘鐨勫湴鏂癸紝鐪嬩笂闈㈡祴璇曚唬鐮佺殑鏈鍚庝竴涓祴璇曪紝灝變細鍙戠幇錛氱▼搴忎笉浼氭牴鎹澧冩潵鍒ゆ柇澶氶煶瀛楃殑鎷奸煶錛屼粎浠呮槸綆鍗曠殑鍙栧闊沖瓧鐨勭涓涓嫾闊熾?/p> 瑕佹寜絎旂敾鎺掑簭錛屽氨瑕佸疄鐜扮瑪鐢繪瘮杈冨櫒銆?/p> class StokeComparator implements Comparator<String> 濡傛灉鏈変釜鏂規硶鍙互姹傚緱姹夊瓧鐨勭瑪鐢繪暟錛屼笂闈㈢殑鍔熻兘灝卞緢瀹規槗瀹炵幇銆傚浣曟眰涓涓眽瀛楃殑絎旂敾鏁幫紵鏈瀹規槗鎯沖埌鐨勫氨鏄煡琛ㄦ硶銆傚緩涓涓眽瀛楃瑪鐢繪暟琛紝濡傦細 濡傛灉鏄繛緇殑銆佹寜unicode緙栫爜鎺掑ソ欏哄簭鐨勮〃錛屽疄闄呭瓨鍌ㄥ湪絎旂敾鏁拌〃涓殑鍙渶鏈鍚庝竴鍒楀氨澶熶簡銆?/p> 閭e浣曞緩榪欎釜琛ㄥ憿錛熻繖涓〃瀛樺偍鍦ㄥ摢閲岋紵 鐜板湪澶у鏁扮郴緇熻繕鍙兘鏀寔Unicode涓殑鍩烘湰姹夊瓧閭i儴鍒嗘眽瀛楋紝緙栫爜浠嶶9FA6-U9FBF銆傛墍浠ユ垜浠彧寤鴻繖閮ㄥ垎姹夊瓧鐨勭瑪鐢昏〃銆傛眽瀛楃瑪鐢繪暟琛紝鎴戜滑鍙互鎸夌収涓嬮潰鐨勬柟娉曠敓鎴愶細 鍦ㄨ繖閲?a href="http://m.tkk7.com/Files/jeff-lau/Stroke.zip" target="_blank">涓嬭澆涓婇潰3涓楠ょ敓鎴愮殑3涓枃浠?/a>銆?/p> /** import java.io.IOException; public class ChineseCoder { public static void main(String[] args) throws IOException { } } 浠嶦xcel鎺掑簭榪囧悗鐨凜hinese.csv鏂囦歡鏉ョ湅錛屾帓濂藉簭鐨勬枃浠惰繕鏄湁涓瀹氳寰嬬殑銆傚湪鏂囦歡鐨勭9琛?12琛屽彲浠ョ湅鍑猴細閫愯鎵弿鐨勬椂鍊欙紝褰搖nicode浼氬彉灝忎簡錛岀瑪鐢繪暟涔熷氨鍔?銆?/p> 20059,涔?br>20101,浜?br>19969,涓?br>19970,涓?/p> 鐢ㄤ笅闈㈢殑Java紼嬪簭鍒嗘瀽鍚с?/p> /** import java.io.File; public class Stroke { /** } 涓婇潰鐢ㄧ殑榪欎釜瑙勫緥鏈夐棶棰樺悧錛熸湁闂錛屼粠ChineseStroke.csv鏂囦歡鎶藉彇鏈鍚庡嚑涓眽瀛楀氨鍙戠幇錛岀瑪鐢繪暟涓嶅銆備負浠涔堝憿錛?/p> 鎴戜滑瑕佷漢宸ユ牳瀵笴hineseStroke鏂囦歡錛屼絾鍙鏍稿鍦ㄧ瑪鐢誨彉鍖栫殑閭e嚑涓眽瀛楃殑絎旂敾鏁般傛渶鍚庯紝鎴戝彂鐜幫紝鍙湁絎旂敾鏁板浜?0鐨勫皯鏁板嚑涓眽瀛楃殑絎旂敾鏁頒笉瀵廣傛牳瀵瑰茍鐭絎旂敾鏁板悗錛岀敤Excel鎸塙nicode閲嶆柊鎺掑簭錛屽幓鎺夋眽瀛楀拰Unicode涓ゅ垪錛屽彧淇濈暀絎旂敾鏁伴偅鍒楋紝寰楀埌Stroke.csv鏂囦歡銆?/p> /** import static org.junit.Assert.assertEquals; import org.junit.Before; public class StrokeTest { Chinese chinese; @Before @Test @Test @Test @Test } /** import java.util.Comparator; public class StrokeComparator implements Comparator<String> { public int compare(String o1, String o2) { Chinese chinese = new Chinese(); for (int i = 0; i < o1.length() && i < o2.length(); i++) { int stroke1 = chinese.stroke(codePoint1); if (stroke1 < 0 || stroke2 < 0) { if (stroke1 != stroke2) { return o1.length() - o2.length(); /** import java.util.Comparator; import org.junit.Assert; import chinese.utility.StrokeComparator; public class StrokeComparatorTest { private Comparator<String> comparator; /** /** import java.util.Comparator; import org.junit.Assert; import chinese.utility.StrokeComparator; public class StrokeComparatorTest { private Comparator<String> comparator; /** Microsoft鍦ㄨ繖鏂歸潰鍋氬緱姣旇緝濂姐傚Sql server 2000錛學ord鍜孍xcel閮借兘鎸夋嫾闊沖拰絎旂敾鎺掑簭銆傝孫racle鍙兘鏄噰鍙栧鏉炬嫾闊蟲帓搴忔硶銆?
鐗堟潈澹版槑錛氬彲浠ヤ換鎰忚漿杞斤紝杞澆鏃惰鍔″繀浠ヨ秴閾炬帴褰㈠紡鏍囨槑鏂囩珷鍘熷鍑哄鍜屼綔鑰呬俊鎭強鏈増鏉冨0鏄?/a>銆?br>http://m.tkk7.com/jeff-lau/archive/2007/12/21/169466.html
* @author Jeff
*
* Copyright (c) 澶嶅埗鎴栬漿杞芥湰鏂囷紝璇蜂繚鐣欒娉ㄩ噴銆?br> */
package chinese.utility.test;
import org.junit.Test;
* 鍗曚釜鏁板瓧 0--9
*/
@Test
public void testSingleLower() {
Assert.assertEquals("闆?, new ChineseNumber(0).lower());
Assert.assertEquals("浜?, new ChineseNumber(5).lower());
}
/**
* 10--99
*/
@Test
public void test2BitLower() {
Assert.assertEquals("鍏崄鍏?, new ChineseNumber(68).lower());
Assert.assertEquals("鍏崄", new ChineseNumber(80).lower());
}
* 100--999
*/
@Test
public void test3BitLower() {
Assert.assertEquals("浜旂櫨闆跺叓", new ChineseNumber(508).lower());
Assert.assertEquals("鍏櫨", new ChineseNumber(800).lower());
}
* 1000--9999
*/
@Test
public void test4BitLower() {
Assert.assertEquals("涓鍗冮浂鍏?, new ChineseNumber(1008).lower());
Assert.assertEquals("涓鍗冮浂鍏崄", new ChineseNumber(1080).lower());
/**
* > 9999
*/
@Test
public void test5BitLower() {
Assert.assertEquals("涓夊崄涓囬浂鍏崈", new ChineseNumber(308000).lower());
Assert.assertEquals("涓夊崄涓囬浂鍏櫨", new ChineseNumber(300800).lower());
}
/**
* 緙╁啓鍜屽ぇ鍐欎竴璧鋒祴
*/
@Test
public void testAbbriation() {
Assert.assertEquals("鎷炬崒", new ChineseNumber(18, true).upper());
}
* @author Jeff
*
* Copyright (c) 澶嶅埗鎴栬漿杞芥湰鏂囷紝璇蜂繚鐣欒娉ㄩ噴銆?br> */
package chinese.utility;
"鐧?, "鍗?, "浜?, "鍗?, "鐧?, "鍗?, "涓?, "鍗?, "鐧?, "鍗?, "涓? };
private String[] LOWER = { "闆?, "涓", "浜?, "涓?, "鍥?, "浜?, "鍏?, "涓?, "鍏?, "涔? };
"浣?, "浠?, "浜?, "鎷?, "浣?, "浠?, "涓?, "鎷?, "浣?, "浠?, "涓? };
private String[] UPPER = { "闆?, "澹?, "璐?, "鍙?, "鑲?, "浼?, "闄?, "鏌?, "鎹?, "鐜? };
private boolean abbreviation;
this.number = number;
this.abbreviation = isShort;
}
this(number, false);
}
return format(LOWER, LOWER_UNIT);
}
public String upper() {
return format(UPPER, UPPER_UNIT);
}
private String format(final String[] chinese, final String[] unit) {
if (number == 0) {
return chinese[number];
}
return formatShort(chinese, unit);
}
String result = "";
int rightNumber = 0;
int currentNumber = 0;
int bit = 0;
while (leftNumber > 0) {
rightNumber = currentNumber;
currentNumber = leftNumber % RADIX;
leftNumber = leftNumber / RADIX;
result = chinese[currentNumber] + unit[bit] + result;
} else if (rightNumber > 0) {
result = chinese[currentNumber] + result;
}
result = unit[bit] + result;
}
}
* 緙╁啓 18 涓?鍗佸叓 鎴?鎷炬崒
*/
private String formatShort(String[] chinese, String[] unit) {
return unit[1] + chinese[number % RADIX];
}
* 鑳藉惁緙╁啓
*/
private boolean canAbbreviate(int number2) {
if (number2 >= 9 && number2 <= 19) {
return true;
}
return false;
}
]]>
鐗堟潈澹版槑錛氬彲浠ヤ換鎰忚漿杞斤紝杞澆鏃惰鍔″繀浠ヨ秴閾炬帴褰㈠紡鏍囨槑鏂囩珷鍘熷鍑哄鍜屼綔鑰呬俊鎭強鏈増鏉冨0鏄?/a>銆?br>http://m.tkk7.com/jeff-lau/archive/2007/12/21/169257.html
鎺掑簭姒傝堪
// 鏁扮粍涓殑鍏冪礌鍙互鏄儚int榪欐牱鐨勫師鐢熺被鍨?primitive type), 涔熷彲浠ユ槸鍍廠tring榪欐牱瀹炵幇浜咰omparable鎺ュ彛鐨勭被鍨嬶紝榪欓噷鐢╰ype琛ㄧず銆?
java.util.Arrays.sort(type[] a);
public static <T> void sort(List<T> list)
public static <T> void sort(T[] a, Comparator<? super T> c)
public static <T> void sort(List<T> list, Comparator<? super T> c)Unicode 緙栫爜涓殑姹夊瓧
琛ㄤ竴 棣栧瓧緙栫爜 灝懼瓧緙栫爜 涓暟 鍩烘湰姹夊瓧 U4E00 U9FBF 20928 寮傛у瓧 UF900 UFAFF 512 鎵╁睍A U3400 U4D8F 512 鎵╁睍B U20000 U2A6DF 42720 琛ュ厖 U2F800 U2FA1F 544 鍏朵粬 ...
GB2312緙栫爜
GBK緙栫爜
鎷奸煶鎺掑簭
瀹芥澗鐨勬嫾闊蟲帓搴忔硶
* @author Jeff
*
* Copyright (c) 澶嶅埗鎴栬漿杞芥湰鏂囷紝璇蜂繚鐣欒娉ㄩ噴銆?br>*/
import java.util.Comparator;
import java.util.Locale;
public int compare(String o1, String o2) {
return Collator.getInstance(Locale.CHINESE).compare(o1, o2);
}
}
* @author Jeff
*
* Copyright (c) 澶嶅埗鎴栬漿杞芥湰鏂囷紝璇蜂繚鐣欒娉ㄩ噴銆?br>*/
* 闈炲父鐢ㄥ瓧(鎬?
*/
@Test
public void testNoneCommon() {
Assert.assertTrue(comparator.compare("鎬?, "寮?) > 0);
}
/**
* 鍚岄煶瀛?br>*/
@Test
public void testSameSound() {
Assert.assertTrue(comparator.compare("鎬?, "甯?) != 0);
}涓ユ牸鐨勬嫾闊蟲帓搴忔硶
* @author Jeff
*
* Copyright (c) 澶嶅埗鎴栬漿杞芥湰鏂囷紝璇蜂繚鐣欒娉ㄩ噴銆?br> */
package chinese.utility;
import net.sourceforge.pinyin4j.PinyinHelper;
int codePoint2 = o2.charAt(i);
|| Character.isSupplementaryCodePoint(codePoint2)) {
i++;
}
if (Character.isSupplementaryCodePoint(codePoint1)
|| Character.isSupplementaryCodePoint(codePoint2)) {
return codePoint1 - codePoint2;
}
String pinyin2 = pinyin((char) codePoint2);
if (!pinyin1.equals(pinyin2)) {
return pinyin1.compareTo(pinyin2);
}
} else {
return codePoint1 - codePoint2;
}
}
}
return o1.length() - o2.length();
}
* 瀛楃鐨勬嫾闊籌紝澶氶煶瀛楀氨寰楀埌絎竴涓嫾闊熾備笉鏄眽瀛楋紝灝眗eturn null銆?br> */
private String pinyin(char c) {
String[] pinyins = PinyinHelper.toHanyuPinyinStringArray(c);
if (pinyins == null) {
return null;
}
return pinyins[0];
}
}
* @author Jeff
*
* Copyright (c) 澶嶅埗鎴栬漿杞芥湰鏂囷紝璇蜂繚鐣欒娉ㄩ噴銆?br> */
package chinese.utility.test;
import org.junit.Test;
* 甯哥敤瀛?br> */
@Test
public void testCommon() {
Assert.assertTrue(comparator.compare("瀛?, "瀹?) < 0);
}
* 涓嶅悓闀垮害
*/
@Test
public void testDifferentLength() {
Assert.assertTrue(comparator.compare("浠栧ザ濂剁殑", "浠栧ザ濂剁殑鐔?) < 0);
}
* 鍜岄潪姹夊瓧姣旇緝
*/
@Test
public void testNoneChinese() {
Assert.assertTrue(comparator.compare("a", "闃?) < 0);
Assert.assertTrue(comparator.compare("1", "闃?) < 0);
}
* 闈炲父鐢ㄥ瓧(鎬?
*/
@Test
public void testNoneCommon() {
Assert.assertTrue(comparator.compare("鎬?, "寮?) < 0);
}
* 鍚岄煶瀛?br> */
@Test
public void testSameSound() {
Assert.assertTrue(comparator.compare("鎬?, "甯?) == 0);
}
* 澶氶煶瀛?鏇?
*/
@Test
public void testMultiSound() {
Assert.assertTrue(comparator.compare("鏇劇粡", "鏇捐開") > 0);
} 絎旂敾鎺掑簭
琛ㄤ簩 姹夊瓧 Unicode緙栫爜 絎旂敾鏁?/td> 涓 U4E00 1 浜?/td> U4E8C 2 榫?/td> U9F8D 16 ... ... ...
寤烘眽瀛楃瑪鐢繪暟琛?/h2>
鐢熸垚Chinese.csv鐨凧ava紼嬪簭
* @author Jeff
*
* Copyright (c) 澶嶅埗鎴栬漿杞芥湰鏂囷紝璇蜂繚鐣欒娉ㄩ噴銆?br> */
package chinese.utility.preface;
import java.io.PrintWriter;
PrintWriter out = new PrintWriter("Chinese.csv");
// 鍩烘湰姹夊瓧
for(char c = 0x4E00; c <= 0x9FA5; c++) {
out.println((int)c + "," + c);
}
out.flush();
out.close(); 鍒濆鍖栫瑪鐢繪暟
* @author Jeff
*
* Copyright (c) 澶嶅埗鎴栬漿杞芥湰鏂囷紝璇蜂繚鐣欒娉ㄩ噴銆?br> */
package chinese.utility.preface;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Scanner;
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
Scanner in = new Scanner(new File("Chinese.csv"));
PrintWriter out = new PrintWriter("ChineseStroke.csv");
String oldLine = "999999";
int stroke = 0;
while (in.hasNextLine()) {
String line = in.nextLine();
if (line.compareTo(oldLine) < 0) {
stroke++;
}
oldLine = line;
out.println(line + "," + stroke);
}
out.flush();
out.close();
in.close();
}
姹傚緱絎旂敾鏁扮殑鏂規硶鍜岀瑪鐢繪瘮杈冨櫒鏂規硶
姹傚緱絎旂敾鏁扮殑鏂規硶嫻嬭瘯浠g爜錛?
* @author Jeff
*
* Copyright (c) 澶嶅埗鎴栬漿杞芥湰鏂囷紝璇蜂繚鐣欒娉ㄩ噴銆?br> */
package chinese.utility.test;
import org.junit.Test;
import chinese.utility.Chinese;
public void setUp() {
chinese = new Chinese();
}
public void testStroke() {
assertEquals(1, chinese.stroke('涓'));
}
public void testStroke2() {
assertEquals(2, chinese.stroke('浜?));
}
public void testStroke16() {
assertEquals(16, chinese.stroke('榫?));
}
public void testStrokeABC() {
assertEquals(-1, chinese.stroke('a'));
} 姹傚緱絎旂敾鏁扮殑鏂規硶浠g爜
* @author Jeff
*
* Copyright (c) 澶嶅埗鎴栬漿杞芥湰鏂囷紝璇蜂繚鐣欒娉ㄩ噴銆?br> */
package chinese.utility;
int codePoint1 = o1.codePointAt(i);
int codePoint2 = o2.codePointAt(i);
if (codePoint1 == codePoint2)
continue;
int stroke2 = chinese.stroke(codePoint2);
return codePoint1 - codePoint2;
}
return stroke1 - stroke2;
}
}
}
}絎旂敾姣旇緝鍣ㄦ祴璇?/h3>
* @author Jeff
*
* Copyright (c) 澶嶅埗鎴栬漿杞芥湰鏂囷紝璇蜂繚鐣欒娉ㄩ噴銆?br> */
package chinese.utility.test;
import org.junit.Before;
import org.junit.Test;
@Before
public void setUp() {
comparator = new StrokeComparator();
}
* 鐩稿悓絎旂敾鏁?br> */
@Test
public void testCompareEquals() {
Assert.assertTrue(comparator.compare("涓", "涓?) == 0);
}
/**
* 涓嶅悓絎旂敾鏁?br> */
@Test
public void testCompare() {
Assert.assertTrue(comparator.compare("涓", "浜?) < 0);
Assert.assertTrue(comparator.compare("鍞?, "椹?) > 0);
}
/**
* 闀垮害涓嶅悓
*/
@Test
public void testCompareDefficultLength() {
Assert.assertTrue(comparator.compare("浜?, "浜屼竴") < 0);
}
/**
* 闈炴眽瀛楃殑姣旇緝
*/
@Test
public void testABC() {
Assert.assertTrue(comparator.compare("涓", "a") > 0);
Assert.assertTrue(comparator.compare("a", "b") < 0);
}
}絎旂敾姣旇緝鍣?
* @author Jeff
*
* Copyright (c) 澶嶅埗鎴栬漿杞芥湰鏂囷紝璇蜂繚鐣欒娉ㄩ噴銆?br> */
package chinese.utility.test;
import org.junit.Before;
import org.junit.Test;
@Before
public void setUp() {
comparator = new StrokeComparator();
}
* 鐩稿悓絎旂敾鏁?br> */
@Test
public void testCompareEquals() {
Assert.assertTrue(comparator.compare("涓", "涓?) == 0);
}
/**
* 涓嶅悓絎旂敾鏁?br> */
@Test
public void testCompare() {
Assert.assertTrue(comparator.compare("涓", "浜?) < 0);
Assert.assertTrue(comparator.compare("鍞?, "椹?) > 0);
}
/**
* 闀垮害涓嶅悓
*/
@Test
public void testCompareDefficultLength() {
Assert.assertTrue(comparator.compare("浜?, "浜屼竴") < 0);
}
/**
* 闈炴眽瀛楃殑姣旇緝
*/
@Test
public void testABC() {
Assert.assertTrue(comparator.compare("涓", "a") > 0);
Assert.assertTrue(comparator.compare("a", "b") < 0);
}
}鍏朵粬紼嬪簭鐨勬眽瀛楁帓搴?/h1>
]]>
浣滆咃細Jeff 鍙戣〃浜庯細2007-12-20 20:39 鏈鍚庢洿鏂頒簬錛?2007騫?2鏈?1鏃?12:17
鐗堟潈澹版槑錛氬彲浠ヤ換鎰忚漿杞斤紝杞澆鏃惰鍔″繀浠ヨ秴閾炬帴褰㈠紡鏍囨槑鏂囩珷鍘熷鍑哄鍜屼綔鑰呬俊鎭強鏈増鏉冨0鏄?/a>銆?br>http://m.tkk7.com/jeff-lau/archive/2007/12/20/169147.html
宸茬粡灝嗐?a href="http://m.tkk7.com/jeff-lau/archive/2007/12/20/169147.html">涓枃鎺掑簭--絎旂敾銆嬪拰銆?a href="http://m.tkk7.com/jeff-lau/archive/2007/12/19/168637.html">涓枃鎺掑簭--姹夎鎷奸煶銆嬩慨鏀瑰茍鍚堝茍銆?a href="http://m.tkk7.com/jeff-lau/archive/2007/12/21/169257.html">涓枃鎺掑簭銆嬩腑銆傝繖閲屽彧淇濈暀鏈鍚庣殑浠g爜銆傚疄鐜扮殑鍘熺悊鍜屾柟娉曡瑙?a href="http://m.tkk7.com/jeff-lau/archive/2007/12/21/169257.html">涓枃鎺掑簭
/**
* @author Jeff
*
* Copyright (c) 澶嶅埗鎴栬漿杞芥湰鏂囷紝璇蜂繚鐣欒娉ㄩ噴銆?br> */
package chinese.utility;
import java.util.Comparator;
public class StrokeComparator implements Comparator<String> {
public int compare(String o1, String o2) {
Chinese chinese = new Chinese();
for (int i = 0; i < o1.length() && i < o2.length(); i++) {
int codePoint1 = o1.codePointAt(i);
int codePoint2 = o2.codePointAt(i);
if (codePoint1 == codePoint2)
continue;
int stroke1 = chinese.stroke(codePoint1);
int stroke2 = chinese.stroke(codePoint2);
if (stroke1 < 0 || stroke2 < 0) {
return codePoint1 - codePoint2;
}
if (stroke1 != stroke2) {
return stroke1 - stroke2;
}
}
return o1.length() - o2.length();
}
}
浣滆咃細Jeff 鍙戣〃浜庯細2007-12-19 08:30 鏈鍚庢洿鏂頒簬錛?2007騫?2鏈?1鏃?12:33
鐗堟潈澹版槑錛氬彲浠ヤ換鎰忚漿杞斤紝杞澆鏃惰鍔″繀浠ヨ秴閾炬帴褰㈠紡鏍囨槑鏂囩珷鍘熷鍑哄鍜屼綔鑰呬俊鎭強鏈増鏉冨0鏄?/a>銆?br>http://m.tkk7.com/jeff-lau/archive/2007/12/19/168637.html
宸茬粡灝嗐?a href="http://m.tkk7.com/jeff-lau/archive/2007/12/20/169147.html">涓枃鎺掑簭--絎旂敾銆嬪拰銆?a href="http://m.tkk7.com/jeff-lau/archive/2007/12/19/168637.html">涓枃鎺掑簭--姹夎鎷奸煶銆嬩慨鏀瑰茍鍚堝茍銆?a href="http://m.tkk7.com/jeff-lau/archive/2007/12/21/169257.html">涓枃鎺掑簭銆嬩腑銆傝繖閲屽彧淇濈暀鏈鍚庣殑浠g爜銆傚疄鐜扮殑鍘熺悊鍜屾柟娉曡瑙?a href="http://m.tkk7.com/jeff-lau/archive/2007/12/21/169257.html">涓枃鎺掑簭銆?/p>
/**
* @author Jeff
*
* Copyright (c) 澶嶅埗鎴栬漿杞芥湰鏂囷紝璇蜂繚鐣欒娉ㄩ噴銆?br> */
package chinese.utility;
import java.util.Comparator;
import net.sourceforge.pinyin4j.PinyinHelper;
public class PinyinComparator implements Comparator<String> {
public int compare(String o1, String o2) {
for (int i = 0; i < o1.length() && i < o2.length(); i++) {
int codePoint1 = o1.charAt(i);
int codePoint2 = o2.charAt(i);
if (Character.isSupplementaryCodePoint(codePoint1)
|| Character.isSupplementaryCodePoint(codePoint2)) {
i++;
}
if (codePoint1 != codePoint2) {
if (Character.isSupplementaryCodePoint(codePoint1)
|| Character.isSupplementaryCodePoint(codePoint2)) {
return codePoint1 - codePoint2;
}
String pinyin1 = pinyin((char) codePoint1);
String pinyin2 = pinyin((char) codePoint2);
if (pinyin1 != null && pinyin2 != null) { // 涓や釜瀛楃閮芥槸姹夊瓧
if (!pinyin1.equals(pinyin2)) {
return pinyin1.compareTo(pinyin2);
}
} else {
return codePoint1 - codePoint2;
}
}
}
return o1.length() - o2.length();
}
/**
* 瀛楃鐨勬嫾闊籌紝澶氶煶瀛楀氨寰楀埌絎竴涓嫾闊熾備笉鏄眽瀛楋紝灝眗eturn null銆?br> */
private String pinyin(char c) {
String[] pinyins = PinyinHelper.toHanyuPinyinStringArray(c);
if (pinyins == null) {
return null;
}
return pinyins[0];
}
}
(灝忓垬璧板悜姝e湪鐜╃數鑴戠殑鑰佸垬韜竟)
灝忓垬錛氳佸垬錛?灝忓垬涓鐩撮兘鏄繖涔堢О鍛艱佸垬鐨?銆傛暀鎴戝Java鍚э紒
鑰佸垬錛氬ソ錛?瀵逛簬灝忓垬鐨勮姹傦紝鑰佸垬浠庢病鎷掔粷榪?
灝忓垬錛氬彲鎴戝Java浠涔堥兘涓嶄細錛?/p>
鑰佸垬錛氭湁鎴戝湪錛屼竴鍒囬兘娌¢棶棰橈紒(鍦ㄥ皬鍒橀潰鍓嶏紝鑰佸垬鎬誨枩嬈㈠惞鍢樸?鎴戜滑鍏堣涓狫ava寮鍙戣繍琛岀幆澧冨惂銆?/p>
灝忓垬錛氬ソ鍛紒
鑰佸垬錛氭垜浠厛鍒癝un鍏徃鐨勭綉绔欎笅杞戒竴涓狫DK銆侸DK灝辨槸鐢ㄦ潵寮鍙慗ava鐨勫伐鍏楓?/p>
灝忓垬錛歋un錛熷氨鏄ぉ涓婄殑閭d釜澶槼鍟婏紒鍘熸潵Java鏄お闃沖叕鍙哥殑鍟婏紒
鑰佸垬錛氬熀鏈笂鍙互榪欎箞璇淬傚叾浠栧叕鍙鎬篃鏈塉DK浜у搧銆傛瘮濡傦細IBM銆?/p>
灝忓垬錛欼BM鎴戠煡閬撱傝鎴戝浗鐨勮仈鎯沖叕鍙告敹璐簡鍢涳紒
鑰佸垬錛?杞昏交絎戜簡涓涓?錛屽氨鏄偅涓狪BM銆備笉榪囪仈鎯沖彧鏀惰喘浜咺BM鐨勪竴涓儴闂ㄨ屽凡銆?/p>
(灝忓垬鍦ㄨ佸垬鐨勬寚瀵間笅錛屼粠SUN緗戠珯涓嬭澆涓涓渶鏂扮殑JDK錛岀幇鍦ㄦ鍦ㄤ笅杞戒腑鈥︹?
灝忓垬錛氬垰鎵嶅湪SUN緗戠珯錛屾垜鐪嬪埌鏈変釜Java SE, Java EE,榪樻湁涓︹?/p>
鑰佸垬錛氳繕鏈塉ava ME銆傝繖鏄疛ava涓轟笉鍚岀殑榪愯鐜鍑嗗鐨?縐嶄笉鍚岀増鏈紝浠栦滑鐢ㄧ殑閮芥槸Java璇█錛屽濂絁ava璇█灝辮兘寮鍙?縐嶄笉鍚屽簲鐢ㄧ▼搴忎簡(Java鍦ㄨ繖3縐嶇増鏈櫎浜嗕嬌鐢ㄧ殑Java鐨勮娉曠浉鍚屽錛岃繕鏈夊緢澶氬緢澶氫笉鍚岀殑涓滆タ瑕佹帉鎻★紝鎵嶈兘涓嶅悓瀹屾垚寮鍙戝伐浣滐紝涓轟簡涓嶆墦鍑誨皬鍒樺涔犵殑縐瀬鎬э紝鎶奡UN钂欎漢鐨勯偅濂椾篃鐢ㄤ笂浜?銆侸ava SE鏄疛ava鐨勬爣鍑嗙増錛孞ava ME鏄敤浜庢墜鏈鴻蔣浠跺紑鍙戠殑錛孞ava EE鏄敤浜庝紒涓氬簲鐢ㄥ紑鍙戯紝姣斿緗戠珯鍟娿?/p>
灝忓垬錛欽ava榪樿兘寤虹綉绔欍傛垜瀛︿細Java錛屽氨鑳界敤Java寤轟竴涓嚜宸辨紓浜殑涓漢緗戠珯浜嗐?鎵樼潃涓嬪反錛屼話鐫澶村紑濮嬮亹鎯充簡鈥︹?
鑰佸垬錛?鏅?******錛岃礬閫旈仴榪滅潃浜?閭e氨鍏堝濂絁ava鍚с?/p>
(灝忓垬鍥炲埌鐜板疄錛岃佸垬緇х畫瑙i噴)
鑰佸垬錛欽ava SE鍙互璇村叾浠栫増鏈殑鍩虹銆傛垜浠氨瀛ava SE銆傜幇鍦ㄦ渶鏂扮殑Java SE鏄?.0錛屼笅杞介〉闈㈠湪http://java.sun.com/javase/downloads/index.jsp銆?/p>
(鐢佃剳鎻愮ず錛氫笅杞芥垚鍔熶簡)
鑰佸垬錛氱幇鍦ㄥ畨瑁呭惂銆?strong>娉ㄦ剰錛欽ava鐨勯粯璁ょ洰褰曟槸C:\Program Files\..., 鏈濂戒笉瑕佹妸Java甯︽湁絀烘牸鐨勮礬寰勪腑銆?/strong>鎴戜滑瀹夎鍦―:\java鐩綍涓惂銆侸ava SE瀹夎鍖呬腑錛岄櫎浜咼DK錛岃繕鏈塉RE銆傝濂絁DK鍚庯紝浼氭彁紺轟綘鏄惁瀹夎JRE錛屾垜浠竴璧峰畨瑁呬簡鍚с?/p>
灝忓垬錛氫粈涔堟槸JRE錛?/p>
鑰佸垬錛欽RE灝辨槸Java榪愯鐜銆傚鏋滀綘鍙兂榪愯Java紼嬪簭錛屽氨涓嶇敤瀹夎JDK錛屽彧闇瑕佸畨瑁呬竴涓狫RE灝卞浜嗐傜幇鍦ㄥ畨瑁呭ソ浜嗐傛垜浠潵鍐欑涓涓叏涓栫晫鏈鏈夊悕鐨勭▼搴忥細HelloWorld銆?/p>
(鑰佸垬鐢ㄨ浜嬫湰鍒涘緩涓嬮潰涓涓枃浠訛細HelloWorld.java)
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
(鑰佸垬鎵撳紑鍛戒護紿楀彛錛岃緭鍏ワ細javac HelloWorld.java銆傜數鑴戞樉紺猴細'javac' 涓嶆槸鍐呴儴鎴栧閮ㄥ懡浠わ紝涔熶笉鏄彲榪愯鐨勭▼搴忔垨鎵瑰鐞嗘枃浠躲?
鑰佸垬錛氭垜浠殑鐢佃剳鏄疻inXP緋葷粺錛屽拰Win2000涓鏍鳳紝閮芥槸WinNT緋葷粺鐨勩傝緗竴涓嬬幆澧冨彉閲忥紝灝辮兘姝e父緙栬瘧浜嗐?/p>
鑰佸垬閫氳繃鐐瑰嚮 鎴戠殑鐢佃剳 --> 灞炴?--> 楂樼駭 --> 鐜鍙橀噺 鎵撳紑浜嗙幆澧冨彉閲忚緗璇濇銆傚湪緋葷粺鍙橀噺涓姞鍏?/p>
JAVA_HOME=D:\java (鏂板緩鐨?
path=%JAVA_HOME%\bin; (榪藉姞鍦╬ath鍙橀噺鏈鍓嶉潰)
(鑰佸垬鍐嶆鎵撳紑鍛戒護紿楀彛錛岃緭鍏ワ細javac HelloWorld.java銆傛甯鎬簡銆傝緭鍏ワ細java HelloWorld銆傜數鑴戞樉紺篐ello World!)
鑰佸垬錛氬厛浼戞伅涓涓嬨傜瓑浼氬効浣犺嚜宸辯収鎴戝垰鎵嶉偅鏍鳳紝鍐欎竴涓狧elloWorld.java鏂囦歡錛屽茍緙栬瘧鍜岃繍琛屽畠銆?/p>
灝忓垬錛氬ソ鐨勩?/p>
(灝忓垬鏄釜濂藉鐨勮彍楦燂紝涓嶄紤鎭氨寮濮嬪ス鐨勭涓涓狫ava紼嬪簭浜嗏︹?
(HelloWorld.java铏界劧綆鍗曠煭灝忥紝綺楀績鐨勫皬鍒樹篃杈撻敊浜嗐傚湪緙栬瘧鐨勬椂鍊欏嚭鏉ヤ簡涓鍫嗛敊璇紝鍦ㄨ佸垬鐨勫府鍔╀笅錛屼竴涓鏀規浜嗚繖浜涢敊璇傝繍琛屾垚鍔熺殑鏃跺欙紝灝忓垬楂樺叴鐨勮煩浜嗚搗鏉ャ傝寰楄嚜宸卞凡緇忔槸Java楂樻墜浜嗐傞珮鍏磋繃鍚庯紝灝忓垬婊″績鐤戦棶鈥︹?
灝忓垬錛氳佸垬錛佽繖浜涗唬鐮佷腑鐨勫崟璇嶉兘浠涔堟剰鎬濓紵
鑰佸垬錛氳繖涔堬紝鏄庡ぉ鍐嶈鍚э紒