使用J2ME在手机中如何实现按照汉字的拼音排序?
谢谢!
[解决办法]
应该要写比较器的吧。
j2se里面是的
[解决办法]
自己做个排好序的码表,然后根据这个码表写个比较器就完了。官方的实现也不过如此。
[解决办法]
我也想知道,自己写个码表,那是大多的字库啊?
不知道有没有获得一个汉字的拼音的开源包?
[解决办法]
unicode编码以前研究过,给你一个程序去研究吧.
汉字转化为全拼的算法
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Set;
/**
*
汉字转化为全拼
*
JDK版本: 1.4
*/
public class CnToSpell {
private static LinkedHashMap spellMap = null;
public static boolean isEn = false;
static {
if (spellMap == null) {
spellMap = new LinkedHashMap(400);
}
initialize();
}
private CnToSpell() {
}
private static void spellPut(String spell, int ascii) {
spellMap.put(spell, new Integer(ascii));
}
private static void initialize() {
spellPut( "a ", -20319);
spellPut( "ai ", -20317);
spellPut( "an ", -20304);
spellPut( "ang ", -20295);
spellPut( "ao ", -20292);
spellPut( "ba ", -20283);
spellPut( "bai ", -20265);
spellPut( "ban ", -20257);
spellPut( "bang ", -20242);
spellPut( "bao ", -20230);
spellPut( "bei ", -20051);
spellPut( "ben ", -20036);
spellPut( "beng ", -20032);
spellPut( "bi ", -20026);
spellPut( "bian ", -20002);
spellPut( "biao ", -19990);
spellPut( "bie ", -19986);
spellPut( "bin ", -19982);
spellPut( "bing ", -19976);
spellPut( "bo ", -19805);
spellPut( "bu ", -19784);
spellPut( "ca ", -19775);
spellPut( "cai ", -19774);
spellPut( "can ", -19763);
spellPut( "cang ", -19756);
spellPut( "cao ", -19751);
spellPut( "ce ", -19746);
spellPut( "ceng ", -19741);
spellPut( "cha ", -19739);
spellPut( "chai ", -19728);
spellPut( "chan ", -19725);
spellPut( "chang ", -19715);
spellPut( "chao ", -19540);
spellPut( "che ", -19531);
spellPut( "chen ", -19525);
spellPut( "cheng ", -19515);
spellPut( "chi ", -19500);
spellPut( "chong ", -19484);
spellPut( "chou ", -19479);
spellPut( "chu ", -19467);
spellPut( "chuai ", -19289);
spellPut( "chuan ", -19288);
spellPut( "chuang ", -19281);
spellPut( "chui ", -19275);
spellPut( "chun ", -19270);
spellPut( "chuo ", -19263);
spellPut( "ci ", -19261);
spellPut( "cong ", -19249);
spellPut( "cou ", -19243);
spellPut( "cu ", -19242);
spellPut( "cuan ", -19238);
spellPut( "cui ", -19235);
spellPut( "cun ", -19227);
spellPut( "cuo ", -19224);
spellPut( "da ", -19218);
spellPut( "dai ", -19212);
spellPut( "dan ", -19038);
spellPut( "dang ", -19023);
spellPut( "dao ", -19018);
spellPut( "de ", -19006);
spellPut( "deng ", -19003);
spellPut( "di ", -18996);
spellPut( "dian ", -18977);
spellPut( "diao ", -18961);
spellPut( "die ", -18952);
spellPut( "ding ", -18783);
spellPut( "diu ", -18774);
spellPut( "dong ", -18773);
spellPut( "dou ", -18763);
spellPut( "du ", -18756);
spellPut( "duan ", -18741);
spellPut( "dui ", -18735);
spellPut( "dun ", -18731);
spellPut( "duo ", -18722);
spellPut( "e ", -18710);
spellPut( "en ", -18697);
spellPut( "er ", -18696);
spellPut( "fa ", -18526);
spellPut( "fan ", -18518);
spellPut( "fang ", -18501);
spellPut( "fei ", -18490);
spellPut( "fen ", -18478);
spellPut( "feng ", -18463);
spellPut( "fo ", -18448);
spellPut( "fou ", -18447);
spellPut( "fu ", -18446);
spellPut( "ga ", -18239);
spellPut( "gai ", -18237);
spellPut( "gan ", -18231);
spellPut( "gang ", -18220);
spellPut( "gao ", -18211);
spellPut( "ge ", -18201);
spellPut( "gei ", -18184);
spellPut( "gen ", -18183);
spellPut( "geng ", -18181);
spellPut( "gong ", -18012);
spellPut( "gou ", -17997);
spellPut( "gu ", -17988);
spellPut( "gua ", -17970);
spellPut( "guai ", -17964);
spellPut( "guan ", -17961);
spellPut( "guang ", -17950);
spellPut( "gui ", -17947);
spellPut( "gun ", -17931);
spellPut( "guo ", -17928);
spellPut( "ha ", -17922);
spellPut( "hai ", -17759);
spellPut( "han ", -17752);
spellPut( "hang ", -17733);
spellPut( "hao ", -17730);
spellPut( "he ", -17721);
spellPut( "hei ", -17703);
spellPut( "hen ", -17701);
spellPut( "heng ", -17697);
spellPut( "hong ", -17692);
spellPut( "hou ", -17683);
spellPut( "hu ", -17676);
spellPut( "hua ", -17496);
spellPut( "huai ", -17487);
spellPut( "huan ", -17482);
spellPut( "huang ", -17468);
spellPut( "hui ", -17454);
spellPut( "hun ", -17433);
spellPut( "huo ", -17427);
spellPut( "ji ", -17417);
spellPut( "jia ", -17202);
spellPut( "jian ", -17185);
spellPut( "jiang ", -16983);
spellPut( "jiao ", -16970);
spellPut( "jie ", -16942);
spellPut( "jin ", -16915);
spellPut( "jing ", -16733);
spellPut( "jiong ", -16708);
spellPut( "jiu ", -16706);
spellPut( "ju ", -16689);
spellPut( "juan ", -16664);
spellPut( "jue ", -16657);
spellPut( "jun ", -16647);
spellPut( "ka ", -16474);
spellPut( "kai ", -16470);
spellPut( "kan ", -16465);
spellPut( "kang ", -16459);
spellPut( "kao ", -16452);
spellPut( "ke ", -16448);
spellPut( "ken ", -16433);
spellPut( "keng ", -16429);
spellPut( "kong ", -16427);
spellPut( "kou ", -16423);
spellPut( "ku ", -16419);
spellPut( "kua ", -16412);
spellPut( "kuai ", -16407);
spellPut( "kuan ", -16403);
spellPut( "kuang ", -16401);
spellPut( "kui ", -16393);
spellPut( "kun ", -16220);
spellPut( "kuo ", -16216);
spellPut( "la ", -16212);
spellPut( "lai ", -16205);
spellPut( "lan ", -16202);
spellPut( "lang ", -16187);
spellPut( "lao ", -16180);
spellPut( "le ", -16171);
spellPut( "lei ", -16169);
spellPut( "leng ", -16158);
spellPut( "li ", -16155);
spellPut( "lia ", -15959);
spellPut( "lian ", -15958);
spellPut( "liang ", -15944);
spellPut( "liao ", -15933);
spellPut( "lie ", -15920);
spellPut( "lin ", -15915);
spellPut( "ling ", -15903);
spellPut( "liu ", -15889);
spellPut( "long ", -15878);
spellPut( "lou ", -15707);
spellPut( "lu ", -15701);
spellPut( "lv ", -15681);
spellPut( "luan ", -15667);
spellPut( "lue ", -15661);
spellPut( "lun ", -15659);
spellPut( "luo ", -15652);
spellPut( "ma ", -15640);
spellPut( "mai ", -15631);
spellPut( "man ", -15625);
spellPut( "mang ", -15454);
spellPut( "mao ", -15448);
spellPut( "me ", -15436);
spellPut( "mei ", -15435);
spellPut( "men ", -15419);
spellPut( "meng ", -15416);
spellPut( "mi ", -15408);
spellPut( "mian ", -15394);
spellPut( "miao ", -15385);
spellPut( "mie ", -15377);
spellPut( "min ", -15375);
spellPut( "ming ", -15369);
spellPut( "miu ", -15363);
spellPut( "mo ", -15362);
spellPut( "mou ", -15183);
spellPut( "mu ", -15180);
spellPut( "na ", -15165);
spellPut( "nai ", -15158);
spellPut( "nan ", -15153);
spellPut( "nang ", -15150);
spellPut( "nao ", -15149);
spellPut( "ne ", -15144);
spellPut( "nei ", -15143);
spellPut( "nen ", -15141);
spellPut( "neng ", -15140);
spellPut( "ni ", -15139);
spellPut( "nian ", -15128);
spellPut( "niang ", -15121);
spellPut( "niao ", -15119);
[解决办法]
spellPut( "nie ", -15117);
spellPut( "nin ", -15110);
spellPut( "ning ", -15109);
spellPut( "niu ", -14941);
spellPut( "nong ", -14937);
spellPut( "nu ", -14933);
spellPut( "nv ", -14930);
spellPut( "nuan ", -14929);
spellPut( "nue ", -14928);
spellPut( "nuo ", -14926);
spellPut( "o ", -14922);
spellPut( "ou ", -14921);
spellPut( "pa ", -14914);
spellPut( "pai ", -14908);
spellPut( "pan ", -14902);
spellPut( "pang ", -14894);
spellPut( "pao ", -14889);
spellPut( "pei ", -14882);
spellPut( "pen ", -14873);
spellPut( "peng ", -14871);
spellPut( "pi ", -14857);
spellPut( "pian ", -14678);
spellPut( "piao ", -14674);
spellPut( "pie ", -14670);
spellPut( "pin ", -14668);
spellPut( "ping ", -14663);
spellPut( "po ", -14654);
spellPut( "pu ", -14645);
spellPut( "qi ", -14630);
spellPut( "qia ", -14594);
spellPut( "qian ", -14429);
spellPut( "qiang ", -14407);
spellPut( "qiao ", -14399);
spellPut( "qie ", -14384);
spellPut( "qin ", -14379);
spellPut( "qing ", -14368);
spellPut( "qiong ", -14355);
spellPut( "qiu ", -14353);
spellPut( "qu ", -14345);
spellPut( "quan ", -14170);
spellPut( "que ", -14159);
spellPut( "qun ", -14151);
spellPut( "ran ", -14149);
spellPut( "rang ", -14145);
spellPut( "rao ", -14140);
spellPut( "re ", -14137);
spellPut( "ren ", -14135);
spellPut( "reng ", -14125);
spellPut( "ri ", -14123);
spellPut( "rong ", -14122);
spellPut( "rou ", -14112);
spellPut( "ru ", -14109);
spellPut( "ruan ", -14099);
spellPut( "rui ", -14097);
spellPut( "run ", -14094);
spellPut( "ruo ", -14092);
spellPut( "sa ", -14090);
spellPut( "sai ", -14087);
spellPut( "san ", -14083);
spellPut( "sang ", -13917);
spellPut( "sao ", -13914);
spellPut( "se ", -13910);
spellPut( "sen ", -13907);
spellPut( "seng ", -13906);
spellPut( "sha ", -13905);
spellPut( "shai ", -13896);
spellPut( "shan ", -13894);
spellPut( "shang ", -13878);
spellPut( "shao ", -13870);
spellPut( "she ", -13859);
spellPut( "shen ", -13847);
spellPut( "sheng ", -13831);
spellPut( "shi ", -13658);
spellPut( "shou ", -13611);
spellPut( "shu ", -13601);
spellPut( "shua ", -13406);
spellPut( "shuai ", -13404);
spellPut( "shuan ", -13400);
spellPut( "shuang ", -13398);
spellPut( "shui ", -13395);
spellPut( "shun ", -13391);
spellPut( "shuo ", -13387);
spellPut( "si ", -13383);
spellPut( "song ", -13367);
spellPut( "sou ", -13359);
spellPut( "su ", -13356);
spellPut( "suan ", -13343);
spellPut( "sui ", -13340);
spellPut( "sun ", -13329);
spellPut( "suo ", -13326);
spellPut( "ta ", -13318);
spellPut( "tai ", -13147);
spellPut( "tan ", -13138);
spellPut( "tang ", -13120);
spellPut( "tao ", -13107);
spellPut( "te ", -13096);
spellPut( "teng ", -13095);
spellPut( "ti ", -13091);
spellPut( "tian ", -13076);
spellPut( "tiao ", -13068);
spellPut( "tie ", -13063);
spellPut( "ting ", -13060);
spellPut( "tong ", -12888);
spellPut( "tou ", -12875);
spellPut( "tu ", -12871);
spellPut( "tuan ", -12860);
spellPut( "tui ", -12858);
spellPut( "tun ", -12852);
spellPut( "tuo ", -12849);
spellPut( "wa ", -12838);
spellPut( "wai ", -12831);
spellPut( "wan ", -12829);
spellPut( "wang ", -12812);
spellPut( "wei ", -12802);
spellPut( "wen ", -12607);
spellPut( "weng ", -12597);
spellPut( "wo ", -12594);
spellPut( "wu ", -12585);
spellPut( "xi ", -12556);
spellPut( "xia ", -12359);
spellPut( "xian ", -12346);
spellPut( "xiang ", -12320);
spellPut( "xiao ", -12300);
spellPut( "xie ", -12120);
spellPut( "xin ", -12099);
spellPut( "xing ", -12089);
spellPut( "xiong ", -12074);
spellPut( "xiu ", -12067);
spellPut( "xu ", -12058);
spellPut( "xuan ", -12039);
spellPut( "xue ", -11867);
spellPut( "xun ", -11861);
spellPut( "ya ", -11847);
spellPut( "yan ", -11831);
spellPut( "yang ", -11798);
spellPut( "yao ", -11781);
spellPut( "ye ", -11604);
spellPut( "yi ", -11589);
spellPut( "yin ", -11536);
spellPut( "ying ", -11358);
spellPut( "yo ", -11340);
spellPut( "yong ", -11339);
spellPut( "you ", -11324);
spellPut( "yu ", -11303);
spellPut( "yuan ", -11097);
spellPut( "yue ", -11077);
spellPut( "yun ", -11067);
spellPut( "za ", -11055);
spellPut( "zai ", -11052);
spellPut( "zan ", -11045);
spellPut( "zang ", -11041);
spellPut( "zao ", -11038);
spellPut( "ze ", -11024);
spellPut( "zei ", -11020);
spellPut( "zen ", -11019);
spellPut( "zeng ", -11018);
spellPut( "zha ", -11014);
spellPut( "zhai ", -10838);
spellPut( "zhan ", -10832);
spellPut( "zhang ", -10815);
spellPut( "zhao ", -10800);
spellPut( "zhe ", -10790);
spellPut( "zhen ", -10780);
spellPut( "zheng ", -10764);
spellPut( "zhi ", -10587);
spellPut( "zhong ", -10544);
spellPut( "zhou ", -10533);
spellPut( "zhu ", -10519);
spellPut( "zhua ", -10331);
spellPut( "zhuai ", -10329);
spellPut( "zhuan ", -10328);
[解决办法]
spellPut( "zhuang ", -10322);
spellPut( "zhui ", -10315);
spellPut( "zhun ", -10309);
spellPut( "zhuo ", -10307);
spellPut( "zi ", -10296);
spellPut( "zong ", -10281);
spellPut( "zou ", -10274);
spellPut( "zu ", -10270);
spellPut( "zuan ", -10262);
spellPut( "zui ", -10260);
spellPut( "zun ", -10256);
spellPut( "zuo ", -10254);
}
/**
* 获得单个汉字的Ascii.
* @param cn char
* 汉字字符
* @return int
* 错误返回 0,否则返回ascii
*/
public static int getCnAscii(char cn) {
byte[] bytes = (String.valueOf(cn)).getBytes();
if (bytes == null || bytes.length > 2 || bytes.length <= 0) { //错误
return 0;
}
if (bytes.length == 1) { //英文字符
return bytes[0];
}
if (bytes.length == 2) { //中文字符
int hightByte = 256 + bytes[0];
int lowByte = 256 + bytes[1];
int ascii = (256 * hightByte + lowByte) - 256 * 256;
//System.out.println( "ASCII= " + ascii);
return ascii;
}
return 0; //错误
}
/**
* 根据ASCII码到SpellMap中查找对应的拼音
* @param ascii int
* 字符对应的ASCII
* @return String
* 拼音,首先判断ASCII是否> 0& <160,如果是返回对应的字符,
*
否则到SpellMap中查找,如果没有找到拼音,则返回null,如果找到则返回拼音.
*/
public static String getSpellByAscii(int ascii,int k) {
if (ascii > 0 && ascii < 160 && k==0) { //单字符为e文不处理;
isEn = true;
}
if(isEn)
return null;
if (ascii > 0 && ascii < 160) { //单字符
return String.valueOf((char) ascii);
}
if (ascii < -20319 || ascii > -10247) { //不知道的字符
return null;
}
Set keySet = spellMap.keySet();
Iterator it = keySet.iterator();
String spell0 = null; ;
String spell = null;
int asciiRang0 = -20319;
int asciiRang;
while (it.hasNext()) {
spell = (String) it.next();
Object valObj = spellMap.get(spell);
if (valObj instanceof Integer) {
asciiRang = ((Integer) valObj).intValue();
if (ascii > = asciiRang0 && ascii < asciiRang) { //区间找到
return (spell0 == null) ? spell : spell0.substring(0,1);
} else {
spell0 = spell;
asciiRang0 = asciiRang;
}
}
}
return null;
}
/**
* 返回字符串的全拼,是汉字转化为全拼,其它字符不进行转换
* @param cnStr String
* 字符串
* @return String
* 转换成全拼后的字符串
*/
public static String getFullSpell(String cnStr) {
isEn = false;
if (null == cnStr || " ".equals(cnStr.trim())) {
return cnStr;
}
char[] chars = cnStr.toCharArray();
StringBuffer retuBuf = new StringBuffer();
for (int i = 0, Len = chars.length; i < Len; i++) {
int ascii = getCnAscii(chars);
if (ascii == 0 || isEn) { //取ascii时出错
retuBuf.append(chars);
} else {
String spell = getSpellByAscii(ascii,i);
if (spell == null) {
retuBuf.append(chars);
} else {
retuBuf.append(spell);
} // end of if spell == null
} // end of if ascii <= -20400
} // end of for
return retuBuf.toString();
}
public static String getFirstSpell(String cnStr) {
return null;
}
public static void main(String[] args) {
String str = null;
str = "晕死噶人2 ";
System.out.println( "Spell= " + CnToSpell.getFullSpell(str)); }
}
[解决办法]
顶LS的代码,很有用!!
[解决办法]
收藏了。谢谢
[解决办法]
自己变个码表很大么?自己算算啊,怎么可能很大!
ucs-2 最多也就6.5万个汉字,一个汉字2字节,2*65k=130k而已!
当然,你是手机应用,资源有限,但如今的设备130k还是应该有的。
另外你还可以考虑缩减码表,6万个字里还有好多是标点以及偏旁,
你可以过滤掉不管,这样又会小很多。
楼主需要的是按拼音排序,并不是要取一个字对应的拼音,
用 hoverlees(好棒) 的方法不合适,因为需要增加大量的存储。
楼主只需要生成一个按音序排好的汉字码表就行了。
[解决办法]
SEVEN Hangzhou 招聘信息:
J2ME高级软件工程师 [5 - 10人] 年薪:8-20万人民币
主要责任:
1.设计、研发和调试Java MIDP应用程序。愿意接受挑战,利用MIDP开发出友好的用户界面和丰富的软件功能。能够研发高性能,高效率的移动代码,并且符合代码 量/内存/外存储限制的程序。
2.能够解决克服因为Java sandbox模型技术的限制,实现与移动设备上不同子系统交换数据并控制功能。能够与服务器开发和客户端开发部门合作,建立统一架构。 与产品经理,QA,和客户支持团队紧密配合,以发展和提高产品性能与质量。
必备任职条件:
1.计算机专业/工程学专业,或其它相关专业硕士或学士学位;英语好。能够与美国工程师就技术问题进行英语口语交流,英语阅读和书写流利。
2.3年以上手机软件行业开发经验。其中,至少要有2年在J2ME和OOP领域的专业研发经验。1年以上MIDP开发经验;有较强的数据结构开发背景,具备出色的发现问题 和解决问题的能力。
3.从上到下,对J2ME/MIDP系统有一个完整的了解;对多线程,客户/服务器中基于TCP/IP基础上的网络API编程有丰富经验;熟悉移动通信和网络技术,了解移动通 信和网络技术常用标准和规则;了解常用的J2ME可选包及不同的JSRs内容。工作自觉,能自我激励。
Website: www.sevenhangzhou.com
Email: sevenchina90@gmail.com
[解决办法]
刚才查了一下,我以前写过的一个码表及比较器。源文件177k,变异出来的class一共才75k不到。
[解决办法]
回manbaum(砸锅上网):
我贴这个程序,不是为了直接解决楼主的问题,而是为了说明编码和汉语拼音的联系.
我不可能只贴一个表,因为我要保证程序的完整性,因为这个程序不是我写的.
从这个表可以看出一个规律,要作第一个汉字的按字母排序,只需将第一个字的编码转成int型,然后简单地比较一下他们的大小就可以了.
[解决办法]
取得int可以像上面程序的这个方法:
/**
* 获得单个汉字的Ascii.
* @param cn char
* 汉字字符
* @return int
* 错误返回 0,否则返回ascii
*/
public static int getCnAscii(char cn) {
byte[] bytes = (String.valueOf(cn)).getBytes();
if (bytes == null || bytes.length > 2 || bytes.length <= 0) { //错误
return 0;
}
if (bytes.length == 1) { //英文字符
return bytes[0];
}
if (bytes.length == 2) { //中文字符
int hightByte = 256 + bytes[0];
int lowByte = 256 + bytes[1];
int ascii = (256 * hightByte + lowByte) - 256 * 256;
//System.out.println( "ASCII= " + ascii);
return ascii;
}
return 0; //错误
}
[解决办法]
从这个表可以看出一个规律,要作第一个汉字的按字母排序,只需将第一个字的编码转成int型,然后简单地比较一下他们的大小就可以了.
-------
是这个样子的么?你自己试试。你这个方式只适用于国标2312的一级汉字库,连2级汉字都不适用,更别说unicode了。