欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-03-21 08:09:31
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中字符串比对处理逻辑
Java判断中文/汉字字符、字符串大小的比对工具(支持含单个或多个中文/汉字、英文、数字以及特殊字符杂糅的字符串大小比对)
Java判断中文/汉字字符、字符串大小的比对工具(支持含单个或多个中文/汉字、英文、数字以及特殊字符杂糅的字符串大小比对)

四、验证测试

定义一些字符和字符串

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));
}

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

测试 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));
}

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

测试 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));
}

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

测试 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));
}

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


本文地址:https://blog.csdn.net/jzycloud/article/details/112849252