2012-04-15 5 views
2

나는 각각이 중국어 문자 또는 숫자 또는 영어 문자로 구성 될 수있는 문자열 목록을 가지고 있습니다. (예 : "z 莉 z 莉", "露 西", "蒋 豪", "qwer", "zout1iao", "hah"). 내가 원하는 것은 안드로이드의 주소록 앱과 같은 알파벳 순서로 정렬하는 것입니다 (즉, "hah", "蒋 豪", "露 西", "qwer", "z 莉 z 莉", "zout1iao") 그래서 내 전략은 모든 한자를 병음으로 변환 한 다음 평소대로 비교합니다. 라이브러리 yinpin4j를 사용해 보았지만 J2SE 플랫폼에서 잘 작동하지만 Android에서 동일한 코드를 실행하면 오류가 발생합니다. 자바 코드는 다음과 같습니다안드로이드에서 중국어를 어떻게 분류합니까?

@Override 
public int compareTo(People another) { 
    String onePinyin = HanziHelper.words2Pinyin(name); 
String theOtherPinyin = HanziHelper.words2Pinyin(another.getName()); 
return onePinyin.compareTo(theOtherPinyin); 
} 

private static String char2String(char c) { 
    StringBuilder sb = new StringBuilder(); 
    return sb.append(c).toString(); 
} 

public static String char2Pinyin(char c) { 
    String[] pinyin = null; 
    try { 
     pinyin = PinyinHelper.toHanyuPinyinStringArray(c, format); 
    } catch(BadHanyuPinyinOutputFormatCombination e) { 
     e.printStackTrace(); 
    } 
    if(pinyin == null) { 
     return char2String(c); 
    } else { 
     return pinyin[0]; 
    } 
} 

public static String words2Pinyin(String words) { 
    StringBuilder sb = new StringBuilder(); 
    char[] chars = words.toCharArray(); 
    for(int i = 0, length = chars.length; i < length; i++) { 
     sb.append(char2Pinyin(chars[i])); 
    } 
    return sb.toString(); 
} 

오류는 다음과 같습니다

04-15 12:37:15.750: W/System.err(6898): java.io.IOException: BufferedInputStream is closed 
04-15 12:37:15.791: W/System.err(6898):  at  java.io.BufferedInputStream.streamClosed(BufferedInputStream.java:116) 
04-15 12:37:15.791: W/System.err(6898):  at java.io.BufferedInputStream.read(BufferedInputStream.java:294) 
04-15 12:37:15.791: W/System.err(6898):  at java.io.InputStreamReader.read(InputStreamReader.java:255) 
04-15 12:37:15.791: W/System.err(6898):  at java.io.BufferedReader.fillBuf(BufferedReader.java:128) 
04-15 12:37:15.791: W/System.err(6898):  at java.io.BufferedReader.read(BufferedReader.java:236) 
04-15 12:37:15.791: W/System.err(6898):  at java.util.Properties.load(Properties.java:307) 
04-15 12:37:15.791: W/System.err(6898):  at java.util.Properties.load(Properties.java:266) 
04-15 12:37:15.791: W/System.err(6898):  at net.sourceforge.pinyin4j.ChineseToPinyinResource.initializeResource(Unknown Source) 
04-15 12:37:15.791: W/System.err(6898):  at net.sourceforge.pinyin4j.ChineseToPinyinResource.<init>(Unknown Source) 
04-15 12:37:15.791: W/System.err(6898):  at net.sourceforge.pinyin4j.ChineseToPinyinResource.<init>(Unknown Source) 
04-15 12:37:15.791: W/System.err(6898):  at net.sourceforge.pinyin4j.ChineseToPinyinResource$ChineseToPinyinResourceHolder.<clinit>(Unknown Source) 
04-15 12:37:15.791: W/System.err(6898):  at net.sourceforge.pinyin4j.ChineseToPinyinResource.getInstance(Unknown Source) 
04-15 12:37:15.796: W/System.err(6898):  at net.sourceforge.pinyin4j.PinyinHelper.getUnformattedHanyuPinyinStringArray(Unknown Source) 
04-15 12:37:15.796: W/System.err(6898):  at net.sourceforge.pinyin4j.PinyinHelper.getFormattedHanyuPinyinStringArray(Unknown Source) 
04-15 12:37:15.796: W/System.err(6898):  at net.sourceforge.pinyin4j.PinyinHelper.toHanyuPinyinStringArray(Unknown Source) 
04-15 12:37:15.796: W/System.err(6898):  at com.sf.tools.HanziHelper.char2Pinyin(HanziHelper.java:29) 
04-15 12:37:15.796: W/System.err(6898):  at com.sf.tools.HanziHelper.words2Pinyin(HanziHelper.java:44) 
04-15 12:37:15.796: W/System.err(6898):  at com.sf.parse.PeopleListParser$Result$People.compareTo(PeopleListParser.java:156) 
04-15 12:37:15.796: W/System.err(6898):  at com.sf.parse.PeopleListParser$Result$People.compareTo(PeopleListParser.java:1) 
04-15 12:37:15.796: W/System.err(6898):  at java.util.ComparableTimSort.countRunAndMakeAscending(ComparableTimSort.java:286) 
04-15 12:37:15.796: W/System.err(6898):  at java.util.ComparableTimSort.sort(ComparableTimSort.java:153) 
04-15 12:37:15.796: W/System.err(6898):  at java.util.ComparableTimSort.sort(ComparableTimSort.java:142) 
04-15 12:37:15.796: W/System.err(6898):  at java.util.Arrays.sort(Arrays.java:1974) 
04-15 12:37:15.796: W/System.err(6898):  at java.util.Collections.sort(Collections.java:1941) 
04-15 12:37:15.796: W/System.err(6898):  at com.sf.activity.PeopleListActivity.initPageView(PeopleListActivity.java:73) 
04-15 12:37:15.796: W/System.err(6898):  at com.sf.activity.ReceiverListActivity.initPageView(ReceiverListActivity.java:23) 
04-15 12:37:15.796: W/System.err(6898):  at com.yek.android.base.BaseActivity.onCreate(BaseActivity.java:158) 

그럼 난 단지 한자가있는 경우 Collator usCollator = Collator.getInstance(Locale.SIMPLIFIED_CHINESE); usCollator.setStrength(Collator.PRIMARY); 그것은 잘 작동 사용하도록 변경. 위의 예제에서이 메서드는 중국어와 영어를 별도로 정렬합니다.

의견이 있으십니까?

+0

같은 방법으로 중국어와 영어 문자를 정렬 하시겠습니까? – UVM

+0

예, 영어로 함께 정렬 할 수있는 것보다 중국어 문자를 병음으로 변환하십시오. – Longerian

+1

자바에서 operartion을 정렬 할 때 유니 코드 만 사용합니다. 사용자의 로켈에 따라 자동으로 조정 됨. 중국 사용자가 휴대 전화의 로켈을 chinese.Also로 설정하면 정렬 된 텍스트를 볼 수 있음 로캘이 영어로 설정된 경우 기본적으로 정렬 된 것으로 표시됩니다. – UVM

답변

0

을 시도하고 새로운 캐릭터 라인을 구축 할 수 있습니다. 다음 코드 포인트가 Latin/Common 인 경우 words2Pinyin()을 호출하지 말고 새로 생성 된 문자열에 채팅을 추가하십시오. 그것은 중국어, words2Pinyin()을 호출하고 병음을 새 문자열에 추가하십시오. 고리. 마지막에는 깨끗한 라틴 문자열이 있습니다. 당신은 단지 구글 수

+0

조언 해 주셔서 감사합니다. 사실, 데모를 실행하기위한 새로운 특정 프로젝트를 설정하고 작동합니다. 그러나 나는 아직도 그 오류가 어떻게 발생하는지 모른다. – Longerian

0

는 연락처 전화에서 데이터를 (예 : 이름, 전화 번호, 이메일, ...), 하나 더 열을 끌어하려고 당기는 경우 pinyin.jar, 그것은 당신에게

+0

감사합니다. – Longerian

0

을 도울 수있는 것 ContactsContract.Contacts.SORT_KEY_PRIMARY이면 표시 이름의 병음을 표시 이름과 함께 저장합니다 (있는 경우).

DISPLAY_NAME "阿妹", 그 SORT_KEY_PRIMARY은 "a 阿 MEI 妹"입니다. "大姨", 분류는 "DA 大 YI 姨"입니다. 거기에서 알파벳 정렬을 쉽게 적용하고 원래 표시 이름에 매핑 할 수 있습니다. :)

관련 문제