Java判断中文/汉字字符、字符串大小的比对工具(支持含单个或多个中文/汉字、英文、数字以及特殊字符杂糅的字符串大小比对)

2022-07-25,,,,

目录

  • 引言
  • 一、依赖引入
  • 二、完整代码(含注解)
  • 三、部分核心代码讲解
  • 四、验证测试
    • 测试 isHanZi()
    • 测试 compareCharWithHanZi()
    • 测试 compareStringWithHanZi()
    • 测试 getFirstStringFromHanyuPinyinStringArray()

引言

不得不说,在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

《Java判断中文/汉字字符、字符串大小的比对工具(支持含单个或多个中文/汉字、英文、数字以及特殊字符杂糅的字符串大小比对).doc》

下载本文的Word格式文档,以方便收藏与打印。