Java判断中文/汉字字符、字符串大小的比对工具(支持含单个或多个中文/汉字、英文、数字以及特殊字符杂糅的字符串大小比对)
程序员文章站
2022-06-23 10:43:30
Java中文/汉字字符、字符串比对工具该工具类移植性,代码复用性较好,且支持含单个或多个中文/汉字、英文、数字以及特殊字符杂糅的字符串大小比对;且将以下代码内容复制后直接粘贴到项目中即可使用!将会持续修复Bug、并且更新完善该工具类,记得收藏一下┗|`O′|┛ 嗷~~ 不得不说,在Java中对纯英文字符串的比对还是十分容易的;但是就目前而言,在Java中想要对纯中文/汉字字符、字符串或者是中英文、数字以及特殊字符杂糅的字符串进行比对,依旧还是没有一个统一的,可以直接调用的工具类。...
目录
引言
不得不说,在Java中对纯英文字符串的比对还是十分容易的;但是就目前而言,在Java中想要对纯中文/汉字字符、字符串或者是中英文、数字以及特殊字符杂糅的字符串进行比对,依旧还是没有一个统一的,可以直接调用的工具类。为此借鉴Java字符串比对的源码以及基于pinyin4j依赖,整合了一个通俗易懂、实用性较高的中文/汉字字符、字符串比对工具。
将会持续修复Bug、并且更新完善该工具类,记得收藏一下┗|`O′|┛ 嗷~~
一、依赖引入
利用Maven引入pinyin4j依赖:
<dependency>
<groupId>com.belerweb</groupId>
<artifactId>pinyin4j</artifactId>
<version>2.5.1</version>
</dependency>
二、完整代码(含注解)
记得导入相关的包和依赖
import net.sourceforge.pinyin4j.PinyinHelper;
import java.util.Objects;
该工具类移植性,代码复用性较好,且支持含单个或多个中文/汉字、英文、数字以及特殊字符杂糅的字符串大小比对;且将以下代码内容复制后直接粘贴到项目中即可使用!
package com.gitee.util.compare;
import net.sourceforge.pinyin4j.PinyinHelper;
import java.util.Objects;
/**
* 比对工具(支持汉字比对)
*
* @author JZY
*/
public class CompareUtil {
/**
* 判断单个字符是否为汉字
*
* @param c 字符
* @return 是否为汉字
*/
public static boolean isHanZi(char c) {
return String.valueOf(c).matches("[\u4e00-\u9fa5]");
}
/**
* 比对两个字符(可含汉字)大小
*
* @param c1 字符1
* @param c2 字符2
* @return 两个字符相差的大小(返回结果大于0表示第一个字符大,返回结果小于0表示第二个字符大,返回结果等于0表示两个字符一样大)
* (针对两个读音和音调相同的中文/汉字字符,再次进行常规的编码大小比对)
*/
public static int compareCharWithHanZi(char c1, char c2) {
boolean b1 = isHanZi(c1);
boolean b2 = isHanZi(c2);
if (b1 && b2) {
int result = Objects.requireNonNull(getFirstStringFromHanyuPinyinStringArray(c1)).compareTo(Objects.requireNonNull(getFirstStringFromHanyuPinyinStringArray(c2)));
return result != 0 ? result : Character.compare(c1, c2);
} else {
return Character.compare(c1, c2);
}
}
/**
* 判断两个字符串(可含汉字)大小
*
* @param string1 字符串1
* @param string2 字符串2
* @return 两个字符串大小的比对结果(返回1表示第一个字符串大,返回-1表示第二个字符串大,返回0表示两个字符串一样大)
*/
public static int compareStringWithHanZi(String string1, String string2) {
char[] charArray1 = string1.toCharArray();
char[] charArray2 = string2.toCharArray();
int length1 = charArray1.length;
int length2 = charArray2.length;
int limit = Math.min(length1, length2);
for (int i = 0; i < limit; i++) {
int result = compareCharWithHanZi(charArray1[i], charArray2[i]);
if (result != 0) {
return result > 0 ? 1 : -1;
}
}
if (length1 == length2) {
return 0;
}
return length1 > length2 ? 1 : -1;
}
/**
* 获取单个字符的第一个汉语拼音
*
* @param c 字符
* @return 汉字字符的第一个汉语拼音
*/
public static String getFirstStringFromHanyuPinyinStringArray(char c) {
String[] strings = PinyinHelper.toHanyuPinyinStringArray(c);
if (strings != null) {
return strings[0];
} else {
return null;
}
}
}
三、部分核心代码讲解
/**
* 判断两个字符串(可含汉字)大小
*
* @param string1 字符串1
* @param string2 字符串2
* @return 两个字符串大小的比对结果(返回1表示第一个字符串大,返回-1表示第二个字符串大,返回0表示两个字符串一样大)
*/
public static int compareStringWithHanZi(String string1, String string2) {
char[] charArray1 = string1.toCharArray();
char[] charArray2 = string2.toCharArray();
int length1 = charArray1.length;
int length2 = charArray2.length;
int limit = Math.min(length1, length2);
for (int i = 0; i < limit; i++) {
int result = compareCharWithHanZi(charArray1[i], charArray2[i]);
if (result != 0) {
return result > 0 ? 1 : -1;
}
}
if (length1 == length2) {
return 0;
}
return length1 > length2 ? 1 : -1;
}
这里的之所以这样设计编写,是借鉴了Java的JDK1.8中字符串比对处理逻辑
四、验证测试
定义一些字符和字符串
String string1 = "李四";
String string2 = "张三";
String string3 = "123王s五";
String string4 = "12a3王s五";
String string5 = "123王z五";
String string6 = "123王z五";
String string7 = "一一壹";
String string8 = "一一医";
char c1 = 'c';
char c2 = 'k';
char c3 = '码';
char c4 = '大';
char c5 = '衣';
char c6 = '依';
char c7 = '#';
char c8 = 'π';
测试 isHanZi()
@Test
void isHanZi() {
System.out.println(CompareUtil.isHanZi(c1));
System.out.println(CompareUtil.isHanZi(c2));
System.out.println(CompareUtil.isHanZi(c3));
System.out.println(CompareUtil.isHanZi(c4));
System.out.println(CompareUtil.isHanZi(c5));
System.out.println(CompareUtil.isHanZi(c6));
System.out.println(CompareUtil.isHanZi(c7));
System.out.println(CompareUtil.isHanZi(c8));
}
测试结果符合预期
测试 compareCharWithHanZi()
@Test
void compareCharWithHanZi()
System.out.println(CompareUtil.compareCharWithHanZi(c1, c2));
System.out.println(CompareUtil.compareCharWithHanZi(c1, c3));
System.out.println(CompareUtil.compareCharWithHanZi(c3, c4));
System.out.println(CompareUtil.compareCharWithHanZi(c5, c6));
System.out.println(CompareUtil.compareCharWithHanZi(c7, c8));
}
测试结果符合预期
测试 compareStringWithHanZi()
@Test
void compareStringWithHanZi() {
System.out.println(CompareUtil.compareStringWithHanZi(string1, string2));
System.out.println(CompareUtil.compareStringWithHanZi(string1, string3));
System.out.println(CompareUtil.compareStringWithHanZi(string3, string5));
System.out.println(CompareUtil.compareStringWithHanZi(string4, string5));
System.out.println(CompareUtil.compareStringWithHanZi(string5, string6));
System.out.println(CompareUtil.compareStringWithHanZi(string7, string8));
}
测试结果符合预期
测试 getFirstStringFromHanyuPinyinStringArray()
@Test
void getFirstStringFromHanyuPinyinStringArray() {
System.out.println(CompareUtil.getFirstStringFromHanyuPinyinStringArray(c1));
System.out.println(CompareUtil.getFirstStringFromHanyuPinyinStringArray(c2));
System.out.println(CompareUtil.getFirstStringFromHanyuPinyinStringArray(c3));
System.out.println(CompareUtil.getFirstStringFromHanyuPinyinStringArray(c4));
System.out.println(CompareUtil.getFirstStringFromHanyuPinyinStringArray(c5));
System.out.println(CompareUtil.getFirstStringFromHanyuPinyinStringArray(c6));
System.out.println(CompareUtil.getFirstStringFromHanyuPinyinStringArray(c7));
System.out.println(CompareUtil.getFirstStringFromHanyuPinyinStringArray(c8));
}
测试结果符合预期
本文地址:https://blog.csdn.net/jzycloud/article/details/112849252