`
wdhdmx
  • 浏览: 302997 次
  • 性别: Icon_minigender_1
  • 来自: 山西
博客专栏
D4bbb5f7-9aa4-3e66-8194-f61b3f0241c2
天天编程
浏览量:21819
社区版块
存档分类
最新评论

StringUtils源码理解(下)

阅读更多

本文介绍StringUtils的剩下的两个方法

1.计算两个字符串相似度

1.1实现简单介绍

实现原理可参考计算字符串相似度算法——Levenshtein

这里的算法区别在于:存差异值的数组由上文中的二维数组,变成这个实现的两个一维数组,并通过不断的交换数值来实现。

1.2源码理解

//计算两个字符串的差异值
public static int getLevenshteinDistance(CharSequence s, CharSequence t) {
        if (s == null || t == null) {
           //容错,抛出的这个异常是表明在传参的时候,传递了一个不合法或不正确的参数。 好像都这样用,illegal:非法。Argument:参数,证据。
           throw new IllegalArgumentException("Strings must not be null");
        }
        //计算传入的两个字符串长度
        int n = s.length(); 
        int m = t.length(); 
        //容错,直接返回结果。这个处理不错
        if (n == 0) {
            return m;
        } else if (m == 0) {
            return n;
        }
        //这一步是根据字符串长短处理,处理后t为长字符串,s为短字符串,方便后面处理
        if (n > m) {
            CharSequence tmp = s;
            s = t;
            t = tmp;
            n = m;
            m = t.length();
        }

        //开辟一个字符数组,这个n是短字符串的长度
        int p[] = new int[n + 1]; 
        int d[] = new int[n + 1]; 
        //用于交换p和d的数组
        int _d[];

        int i; 
        int j; 
        char t_j; 
        int cost; 
        //赋初值
        for (i = 0; i <= n; i++) {
            p[i] = i;
        }

        for (j = 1; j <= m; j++) {
            //t是字符串长的那个字符
            t_j = t.charAt(j - 1);
            d[0] = j;

            for (i = 1; i <= n; i++) {
                //计算两个字符是否一样,一样返回0。
                cost = s.charAt(i - 1) == t_j ? 0 : 1;
                //可以将d的字符数组全部赋值。
                d[i] = Math.min(Math.min(d[i - 1] + 1, p[i] + 1), p[i - 1] + cost);
            }

            //交换p和d
            _d = p;
            p = d;
            d = _d;
        }
        
        //最后的一个值即为差异值
        return p[n];
}

差异值算出来后,除以字符串长度就能算出相似度。

2.去掉字符串中的口音(就是将Ë 转换成 E)

 public static String stripAccents(String input) {}

在这个方法的注释里面,写到java1.6 用到的是java.text.Normalizer,java1.3-1.5用的是sun.text.Normalizer。

同时建议让我们去参考Lucene2.9  的ASCIIFoldingFilter。

2.1带口音的字符从哪里来

首先ASCII码是八位,但是只用到0-127,最高位是用于校验,128-255被用到这样‘Î’,’ Ë‘ 的字符,未收录ASCII中。所以这个方法是将这些带有口音的字符变成标准的(a-z)|(A-Z)。

举例:前面是ascII编码,后面是字符

226:â
227:ã
228:ä
229:å
230:æ
231:ç
232:è
233:é
234:ê

2.2源码理解

这个源码对我来说不容易看,对字符编码之间的转换不理解,看源码会有点吃力,费很多时间,所以就不看了,实现的话,大概就是先把需要转换的部分转换成标准编码,再删除多余的字符。java的字符编码是UTF-8,所以应该变为UTF-8。

3.结束

StringUtils看完了,这两个方法查了不少东西才看下来,同时也学了很多。

 

 

 

 

0
0
分享到:
评论

相关推荐

    StringUtils源码及使用文档

    `StringUtils`是Apache Commons Lang库中的一个核心工具类,它提供了大量的静态方法,用于处理字符串。这个类在Java开发中非常常见,因为它弥补了Java标准库中对字符串操作的不足。`StringUtils`类包含了多种字符串...

    StringUtils 从报文中取得数据

    在阅读《StringUtils 从报文中取得数据》这篇博客时,你可能会学到如何结合使用这些方法来解析复杂的报文数据,理解源码可以加深对工具类的理解,并能更好地应用到实际项目中。通过分析StringUtils 的源码,开发者...

    StringUtils NumberUtils DateUtils

    在标签中提到的"源码",意味着这些工具类的实现细节是开放的,开发者可以通过阅读源码来理解其内部工作原理,学习优秀代码的设计模式和最佳实践。"工具"则表明它们是作为开发者的工具,帮助解决日常编码中的常见问题...

    commons lang 源码

    这个源码包,`commons-lang-2.0-src`,包含了Lang项目的2.0版本的所有源代码,是深入理解Java编程和学习开源项目开发的良好资源。下面,我们将详细探讨这个库中的关键知识点。 1. **StringUtils**: - `...

    mysql-connector-java-5.1.26源码

    在源码中,我们可以看到`com.mysql.jdbc.CharsetMapper`和`com.mysql.jdbc.StringUtils`的相关实现。 通过分析MySQL Connector/J的源码,开发者可以更好地理解JDBC的工作机制,学习数据库驱动的实现,这对于开发...

    apache-common最全的源码

    "apache-common最全的源码" 提供了该项目的完整源代码,这对于开发者来说是一份宝贵的资源,可以深入理解其实现机制,学习优秀的编程实践,以及进行二次开发或定制。 Apache Commons 包含了多个模块,每个模块都有...

    Android应用源码之xUtils-master.zip

    在本文中,我们将深入探讨xUtils的源码,理解其内部实现机制,以便更好地利用这个强大的工具。 首先,我们来看xUtils的核心模块: 1. **网络请求库**:xUtils提供了HttpUtils,基于HttpURLConnection实现了网络...

    Android 英语朗读器源码.zip

    本篇文章将深入探讨一个特定的Android应用项目——“英语朗读器”的源码,旨在帮助开发者理解并学习如何在Android环境中实现语音合成技术,为用户提供英语发音练习的功能。 首先,我们要明白,这个应用的核心功能是...

    commons-lang3-3.5源码1

    源码阅读不仅有助于理解这些工具类的内部工作原理,也有助于我们借鉴和应用到自己的项目中,提升代码的可维护性和复用性。对于Java开发者来说,掌握Apache Commons Lang 3.5的源码无疑是提升技能的重要一步。

    apache commons lang、io、collection源码与UT

    源码分析可以帮助我们理解如何高效地处理这些常见任务。例如,StringUtils 类提供了各种字符串操作方法,如 join、split 和 startsWith,而 NumberUtils 提供了更安全的数字转换方法,避免了空指针异常。 2. **...

    Android应用源码(精)xUtils2.2.5源码.zip

    通过对xUtils 2.2.5源码的分析,我们可以学习到如何设计一个全面的Android工具库,理解各种组件的设计模式和实现原理,这对于提升个人的Android开发技能大有裨益。同时,源码中的最佳实践也能为我们的项目提供宝贵的...

    28个java常用的工具类源码

    以上工具类在实际开发中都有着广泛的应用,通过学习和理解这些源码,不仅可以提高编程效率,还能加深对Java语言特性的理解和运用。同时,这些工具类的源码也是学习设计模式、优化技巧的好材料。

    Android应用源码仿支付宝九宫格解锁.zip源码资源下载

    例如,`org.apache.commons.lang3.StringUtils`库可能用于字符串操作,`httpclient`库可能用于网络通信。 在实现过程中,你需要考虑以下几点: - 界面设计:确保九宫格的布局适应不同屏幕尺寸,以及视觉效果的美观...

    commons-lang-3-3.1 jar包和源码包

    通过源码包,开发者可以直接查看和学习这些工具类的实现细节,理解其工作原理,这对于学习和提高Java编程技能非常有帮助。此外,对于需要定制或扩展已有功能的开发者,源码可以提供宝贵的参考和灵感。 总之,Apache...

    commons-lang-源码跟帮助

    这个"commons-lang-源码跟帮助"文件包含了Apache Commons Lang库的源代码和相关的帮助文档,对于理解其内部工作原理和优化你的Java项目非常有帮助。下面将详细探讨这个库中的关键知识点。 1. **StringUtils**: 这是...

    commons-lang-2.4-src 源码

    这个源码包"commons-lang-2.4-src"包含了2.4版本的完整源代码,对于Java开发者来说,这是一个宝贵的资源,可以深入理解如何实现常见的编程任务,例如字符串处理、日期和时间操作、数学计算以及对象创建等。...

    java常用工具类已经打成jar包包含源码

    其次,这个jar包还包含了源码,这意味着开发者可以查看并理解这些工具类的内部实现。这对于学习Java编程技巧、优化代码或者根据实际需求扩展功能非常有帮助。开发者可以查看源码,了解某个方法的具体实现,或者在...

    Android 仿快播搜索框上方悬浮的文字搜索源码.zip源码资源下载

    该资源是一个针对Android平台的开发项目,旨在实现类似快播应用中的搜索框上方悬浮的文字搜索...通过深入研究和理解这个源码,开发者可以更好地掌握Android UI的定制、Java编程技巧以及如何利用第三方库提升开发效率。

    commons-lang-2.5-sources.jar源码jar包

    这个"commons-lang-2.5-sources.jar"源码包包含了Lang项目2.5版本的所有源代码,这对于开发者来说是极其宝贵的资源,因为它允许深入理解内部实现,进行学习、调试或自定义修改。 在Lang库中,有许多关键知识点值得...

    Android随机验证码.zip源码资源下载

    在Android开发中,验证码是一种常见的安全机制,用于防止自动化脚本或机器人滥用服务。...通过学习和理解这份源码,开发者可以更好地理解和应用Android的UI交互、事件处理以及Java的随机数生成技术。

Global site tag (gtag.js) - Google Analytics