本文介绍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看完了,这两个方法查了不少东西才看下来,同时也学了很多。
分享到:
相关推荐
`StringUtils`是Apache Commons Lang库中的一个核心工具类,它提供了大量的静态方法,用于处理字符串。这个类在Java开发中非常常见,因为它弥补了Java标准库中对字符串操作的不足。`StringUtils`类包含了多种字符串...
在阅读《StringUtils 从报文中取得数据》这篇博客时,你可能会学到如何结合使用这些方法来解析复杂的报文数据,理解源码可以加深对工具类的理解,并能更好地应用到实际项目中。通过分析StringUtils 的源码,开发者...
在标签中提到的"源码",意味着这些工具类的实现细节是开放的,开发者可以通过阅读源码来理解其内部工作原理,学习优秀代码的设计模式和最佳实践。"工具"则表明它们是作为开发者的工具,帮助解决日常编码中的常见问题...
这个源码包,`commons-lang-2.0-src`,包含了Lang项目的2.0版本的所有源代码,是深入理解Java编程和学习开源项目开发的良好资源。下面,我们将详细探讨这个库中的关键知识点。 1. **StringUtils**: - `...
在源码中,我们可以看到`com.mysql.jdbc.CharsetMapper`和`com.mysql.jdbc.StringUtils`的相关实现。 通过分析MySQL Connector/J的源码,开发者可以更好地理解JDBC的工作机制,学习数据库驱动的实现,这对于开发...
"apache-common最全的源码" 提供了该项目的完整源代码,这对于开发者来说是一份宝贵的资源,可以深入理解其实现机制,学习优秀的编程实践,以及进行二次开发或定制。 Apache Commons 包含了多个模块,每个模块都有...
在本文中,我们将深入探讨xUtils的源码,理解其内部实现机制,以便更好地利用这个强大的工具。 首先,我们来看xUtils的核心模块: 1. **网络请求库**:xUtils提供了HttpUtils,基于HttpURLConnection实现了网络...
本篇文章将深入探讨一个特定的Android应用项目——“英语朗读器”的源码,旨在帮助开发者理解并学习如何在Android环境中实现语音合成技术,为用户提供英语发音练习的功能。 首先,我们要明白,这个应用的核心功能是...
源码阅读不仅有助于理解这些工具类的内部工作原理,也有助于我们借鉴和应用到自己的项目中,提升代码的可维护性和复用性。对于Java开发者来说,掌握Apache Commons Lang 3.5的源码无疑是提升技能的重要一步。
源码分析可以帮助我们理解如何高效地处理这些常见任务。例如,StringUtils 类提供了各种字符串操作方法,如 join、split 和 startsWith,而 NumberUtils 提供了更安全的数字转换方法,避免了空指针异常。 2. **...
通过对xUtils 2.2.5源码的分析,我们可以学习到如何设计一个全面的Android工具库,理解各种组件的设计模式和实现原理,这对于提升个人的Android开发技能大有裨益。同时,源码中的最佳实践也能为我们的项目提供宝贵的...
以上工具类在实际开发中都有着广泛的应用,通过学习和理解这些源码,不仅可以提高编程效率,还能加深对Java语言特性的理解和运用。同时,这些工具类的源码也是学习设计模式、优化技巧的好材料。
例如,`org.apache.commons.lang3.StringUtils`库可能用于字符串操作,`httpclient`库可能用于网络通信。 在实现过程中,你需要考虑以下几点: - 界面设计:确保九宫格的布局适应不同屏幕尺寸,以及视觉效果的美观...
通过源码包,开发者可以直接查看和学习这些工具类的实现细节,理解其工作原理,这对于学习和提高Java编程技能非常有帮助。此外,对于需要定制或扩展已有功能的开发者,源码可以提供宝贵的参考和灵感。 总之,Apache...
这个"commons-lang-源码跟帮助"文件包含了Apache Commons Lang库的源代码和相关的帮助文档,对于理解其内部工作原理和优化你的Java项目非常有帮助。下面将详细探讨这个库中的关键知识点。 1. **StringUtils**: 这是...
这个源码包"commons-lang-2.4-src"包含了2.4版本的完整源代码,对于Java开发者来说,这是一个宝贵的资源,可以深入理解如何实现常见的编程任务,例如字符串处理、日期和时间操作、数学计算以及对象创建等。...
其次,这个jar包还包含了源码,这意味着开发者可以查看并理解这些工具类的内部实现。这对于学习Java编程技巧、优化代码或者根据实际需求扩展功能非常有帮助。开发者可以查看源码,了解某个方法的具体实现,或者在...
该资源是一个针对Android平台的开发项目,旨在实现类似快播应用中的搜索框上方悬浮的文字搜索...通过深入研究和理解这个源码,开发者可以更好地掌握Android UI的定制、Java编程技巧以及如何利用第三方库提升开发效率。
这个"commons-lang-2.5-sources.jar"源码包包含了Lang项目2.5版本的所有源代码,这对于开发者来说是极其宝贵的资源,因为它允许深入理解内部实现,进行学习、调试或自定义修改。 在Lang库中,有许多关键知识点值得...
在Android开发中,验证码是一种常见的安全机制,用于防止自动化脚本或机器人滥用服务。...通过学习和理解这份源码,开发者可以更好地理解和应用Android的UI交互、事件处理以及Java的随机数生成技术。