-
package test;
-
-
import net.sourceforge.pinyin4j.PinyinHelper;
-
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
-
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
-
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
-
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;
-
-
/**
-
* @className:PinyingUtil.java
-
* @classDescription:拼音操作工具类
-
* @author:xiayingjie
-
* @createTime:
2010
-
10
-
21
-
*/
-
-
public class PinyinUtil {
-
-
/**
-
* 将字符串转换成拼音数组
-
*
-
* @param src
-
* @return
-
*/
-
public static String[] stringToPinyin(String src) {
-
return stringToPinyin(src, false, null);
-
}
-
/**
-
* 将字符串转换成拼音数组
-
*
-
* @param src
-
* @return
-
*/
-
public static String[] stringToPinyin(String src,String separator) {
-
return stringToPinyin(src, true, separator);
-
}
-
-
/**
-
* 将字符串转换成拼音数组
-
*
-
* @param src
-
* @param isPolyphone
-
* 是否查出多音字的所有拼音
-
* @param separator
-
* 多音字拼音之间的分隔符
-
* @return
-
*/
-
public static String[] stringToPinyin(String src, boolean isPolyphone,
-
String separator) {
-
// 判断字符串是否为空
-
if (
""
.equals(src) || null == src) {
-
return null;
-
}
-
char[] srcChar = src.toCharArray();
-
int srcCount = srcChar.length;
-
String[] srcStr = new String[srcCount];
-
-
for (int i =
0
; i < srcCount; i++) {
-
srcStr[i] = charToPinyin(srcChar[i], isPolyphone, separator);
-
}
-
return srcStr;
-
}
-
-
/**
-
* 将单个字符转换成拼音
-
*
-
* @param src
-
* @return
-
*/
-
public static String charToPinyin(char src, boolean isPolyphone,
-
String separator) {
-
// 创建汉语拼音处理类
-
HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
-
// 输出设置,大小写,音标方式
-
defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
-
defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
-
-
StringBuffer tempPinying = new StringBuffer();
-
-
-
// 如果是中文
-
if (src >
128
) {
-
try {
-
// 转换得出结果
-
String[] strs = PinyinHelper.toHanyuPinyinStringArray(src,
-
defaultFormat);
-
-
-
// 是否查出多音字,默认是查出多音字的第一个字符
-
if (isPolyphone && null != separator) {
-
for (int i =
0
; i < strs.length; i++) {
-
tempPinying.append(strs[i]);
-
if (strs.length != (i +
1
)) {
-
// 多音字之间用特殊符号间隔起来
-
tempPinying.append(separator);
-
}
-
}
-
} else {
-
tempPinying.append(strs[
0
]);
-
}
-
-
} catch (BadHanyuPinyinOutputFormatCombination e) {
-
e.printStackTrace();
-
}
-
} else {
-
tempPinying.append(src);
-
}
-
-
return tempPinying.toString();
-
-
}
-
-
-
public static String hanziToPinyin(String hanzi){
-
return hanziToPinyin(hanzi,
" "
);
-
}
-
/**
-
* 将汉字转换成拼音
-
* @param hanzi
-
* @param separator
-
* @return
-
*/
-
@SuppressWarnings(
"deprecation"
)
-
public static String hanziToPinyin(String hanzi,String separator){
-
// 创建汉语拼音处理类
-
HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
-
// 输出设置,大小写,音标方式
-
defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
-
defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
-
-
String pinyingStr=
""
;
-
try {
-
pinyingStr=PinyinHelper.toHanyuPinyinString(hanzi, defaultFormat, separator);
-
} catch (BadHanyuPinyinOutputFormatCombination e) {
-
// TODO Auto-generated catch block
-
e.printStackTrace();
-
}
-
return pinyingStr;
-
}
-
/**
-
* 将字符串数组转换成字符串
-
* @param str
-
* @param separator 各个字符串之间的分隔符
-
* @return
-
*/
-
public static String stringArrayToString(String[] str, String separator) {
-
StringBuffer sb = new StringBuffer();
-
for (int i =
0
; i < str.length; i++) {
-
sb.append(str[i]);
-
if (str.length != (i +
1
)) {
-
sb.append(separator);
-
}
-
}
-
return sb.toString();
-
}
-
/**
-
* 简单的将各个字符数组之间连接起来
-
* @param str
-
* @return
-
*/
-
public static String stringArrayToString(String[] str){
-
return stringArrayToString(str,
""
);
-
}
-
/**
-
* 将字符数组转换成字符串
-
* @param str
-
* @param separator 各个字符串之间的分隔符
-
* @return
-
*/
-
public static String charArrayToString(char[] ch, String separator) {
-
StringBuffer sb = new StringBuffer();
-
for (int i =
0
; i < ch.length; i++) {
-
sb.append(ch[i]);
-
if (ch.length != (i +
1
)) {
-
sb.append(separator);
-
}
-
}
-
return sb.toString();
-
}
-
-
/**
-
* 将字符数组转换成字符串
-
* @param str
-
* @return
-
*/
-
public static String charArrayToString(char[] ch) {
-
return charArrayToString(ch,
" "
);
-
}
-
-
/**
-
* 取汉字的首字母
-
* @param src
-
* @param isCapital 是否是大写
-
* @return
-
*/
-
public static char[] getHeadByChar(char src,boolean isCapital){
-
//如果不是汉字直接返回
-
if (src <=
128
) {
-
return new char[]{src};
-
}
-
//获取所有的拼音
-
String []pinyingStr=PinyinHelper.toHanyuPinyinStringArray(src);
-
-
//创建返回对象
-
int polyphoneSize=pinyingStr.length;
-
char [] headChars=new char[polyphoneSize];
-
int i=
0
;
-
//截取首字符
-
for(String s:pinyingStr){
-
char headChar=s.charAt(
0
);
-
//首字母是否大写,默认是小写
-
if(isCapital){
-
headChars[i]=Character.toUpperCase(headChar);
-
}else{
-
headChars[i]=headChar;
-
}
-
i++;
-
}
-
-
return headChars;
-
}
-
/**
-
* 取汉字的首字母(默认是大写)
-
* @param src
-
* @return
-
*/
-
public static char[] getHeadByChar(char src){
-
return getHeadByChar(src,true);
-
}
-
/**
-
* 查找字符串首字母
-
* @param src
-
* @return
-
*/
-
public static String[] getHeadByString(String src){
-
return getHeadByString( src, true);
-
}
-
/**
-
* 查找字符串首字母
-
* @param src
-
* @param isCapital 是否大写
-
* @return
-
*/
-
public static String[] getHeadByString(String src,boolean isCapital){
-
return getHeadByString( src, isCapital,null);
-
}
-
/**
-
* 查找字符串首字母
-
* @param src
-
* @param isCapital 是否大写
-
* @param separator 分隔符
-
* @return
-
*/
-
public static String[] getHeadByString(String src,boolean isCapital,String separator){
-
char[]chars=src.toCharArray();
-
String[] headString=new String[chars.length];
-
int i=
0
;
-
for(char ch:chars){
-
-
char[]chs=getHeadByChar(ch,isCapital);
-
StringBuffer sb=new StringBuffer();
-
if(null!=separator){
-
int j=
1
;
-
-
for(char ch1:chs){
-
sb.append(ch1);
-
if(j!=chs.length){
-
sb.append(separator);
-
}
-
j++;
-
}
-
}else{
-
sb.append(chs[
0
]);
-
}
-
headString[i]=sb.toString();
-
i++;
-
}
-
return headString;
-
}
-
-
public static void main(String[] args) {
-
System.out.println(PinyinUtil.stringArrayToString(getHeadByString(
"我的心肝爱上"
),
"-"
));
-
-
}
-
-
}
上面这个pinyinUtil类是pinyin4j包中的一个工具类,有多种方法供大家使用。
User类,相信不用再贴出来了,大家懂的。。。
下面这个类是实现排序的类了。
-
package
test;
-
-
import
java.util.ArrayList;
-
import
java.util.Collections;
-
import
java.util.Comparator;
-
import
java.util.List;
-
-
public
class
HanZiSort {
-
public
static
void
main(String[] args) {
-
List<User> list=
new
ArrayList<User>();
-
User u=
new
User();
-
u.setName(
"张三"
);
-
u.setAge(
21
);
-
list.add(u);
-
-
u=
new
User();
-
u.setName(
"李四"
);
-
u.setAge(
18
);
-
list.add(u);
-
-
u=
new
User();
-
u.setName(
"王五"
);
-
u.setAge(
25
);
-
list.add(u);
-
-
u=
new
User();
-
u.setName(
"寒子"
);
-
u.setAge(
89
);
-
list.add(u);
-
-
for
(User user: list) {
-
System.out.println(PinyinUtil.hanziToPinyin(user.getName()));
-
}
-
Collections.sort(list,
new
ToSort());
-
System.out.println(
"排序后!!!!!!!!!"
);
-
for
(User user: list) {
-
System.out.println(PinyinUtil.hanziToPinyin(user.getName()));
-
}
-
}
-
}
-
-
class
ToSort
implements
Comparator<User> {
-
@Override
-
public
int
compare(User o1, User o2) {
-
-
String s1=PinyinUtil.hanziToPinyin(o1.getName());
-
String s2=PinyinUtil.hanziToPinyin(o2.getName());
-
if
(s1.compareTo(s2)>
0
) {
-
return
1
;
-
}
else
{
-
return
-
1
;
-
}
-
}
-
}
Java代码
-
zhang san
-
li si
-
wang wu
-
han zi
-
排序后!!!!!!!!!
-
han zi
-
li si
-
wang wu
-
zhang san
Pinyin4j中的pinyinutil类代码 package test; import net.sourceforge.pinyin4j.PinyinHelper; import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType; import net.sourceforge.pinyin4j.fo
如下比较器实现了
汉字
按照字母顺序进行
排序
,输入字符为英文字符将会排在
汉字
之前。可将待
排序
的DevelopmentGuideFolder放在list中,然后使用Collections.sort(list, new ZhongWenComparator());进行
排序
。
/** *
汉字
比较器. */ public static class ZhongWenComparator imple...
SELECT DISTINCT province_name, province_code FROM `metadata_township` ORDER BY convert(province_name USING gbk) asc
一般的
排序
都是能正确的,但是有的多音字啥的会有点差别,例如重庆,按理说是重是“chong”,但是
排序
的时候会按照“zhong”,就会排在靠后的。
Java
中按照
拼音
排序
我的list里面是对象,对象里面含有需要按照
拼音
排序
的字段name,我用
一,就是在用
java
代码处理在这里插入代码片
要实现
汉字
按首字母
排序
,主要是设置语言环境,如下语句设置语言环境:
这里用到了Collator类,此类实现了Comparator接口,用他的getInstance就可以用指定的语言环境来构造一个Collator对象:
然后用如下语句创建Comparator:
Comparator<Object> c...
Java
本身并没有提供
汉字
拼音
排序
的功能。但是,我们可以使用第三方库或者自己实现算法来解决这个问题。
下面是使用开源库"
Pinyin
4j"实现
汉字
拼音
排序
的示例代码:
import net.sourceforge.
pinyin
4j.
Pinyin
Helper;
import net.sourceforge.
pinyin
4j.format.Hanyu
Pinyin
CaseType;
import...
比较简单的问题,可以用Collections.sort()来进行
排序
一般情况下我们会这样做; private static final List<TestEntity> testEntities = new ArrayList<TestEntity>(); static {
testEntities.add(new TestEntity("李循环", 12));
默认的 Collection.sort() 是按照 ASCII 码
排序
, 不过, 有第二个重载方法, 第二个参数可以传入 Comparator 对象
java
.text.Collator 可以用于本地语言
排序
, 自身已经实现 Comparator 接口.Collator.getInstance(Locale.CHINA) 获取到我们中文的 Collator 实例
* 按照
拼音
首字母
排序
@Test
public void test() {
List<String> .
参考资料:
https://www.cnblogs.com/zhangqie/p/9456401.html
https://blog.csdn.net/weixin_42311000/article/details/114711578
结合以上的2个帖子进行了改进,得到的结果如下:
(1)依赖的jar:
<dependency>
<groupId>com.belerweb</groupId>
<artifactId&g
public static String to
Pinyin
(String hanzi) {
StringBuilder sb = new StringBuilder();
for (char c : hanzi.toCharArray()) {
String[]
pinyin
Array =
Pinyin
Helper.toHanyu
Pinyin
StringArray(c);
if (
pinyin
Array != null &&
pinyin
Array.length > 0) {
sb.append(
pinyin
Array[0]);
} else {
sb.append(c);
return sb.toString();
使用HanLP进行
汉字
转
拼音
:
1.首先需要下载HanLP的jar包,并将其导入项目中。
2.使用以下代码实现
汉字
转
拼音
:
import com.hankcs.hanlp.HanLP;
public class
Pinyin
Util {
* 将
汉字
转
换为
拼音
* @param hanzi
汉字
字符串
* @return
拼音
字符串
public static String to
Pinyin
(String hanzi) {
return HanLP.convertTo
Pinyin
String(hanzi, "", false);
其中,第三个参数表示是否保留
拼音
之间的空格。如果为true,则会保留空格;如果为false,则会去掉空格。