利用StringUtils计算两个字符串相似度

jopen 12年前
     <h3>1.1实现简单介绍</h3>    <p>实现原理可参考<a href="http://www.google.com.hk/url?sa=t&rct=j&q=site:www.open-open.com+%E8%AE%A1%E7%AE%97%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%9B%B8%E4%BC%BC%E5%BA%A6%E7%AE%97%E6%B3%95%E2%80%94%E2%80%94Levenshtein&source=web&cd=1&ved=0CCoQFjAA&url=http%3A%2F%2Fwww.open-open.com%2Fhome%2Fspace.php%3Fuid%3D37924%26do%3Dblog%26id%3D5646&ei=4SUUT4rmG8aviQfmsthD&usg=AFQjCNFxn3uNIJOgCRhVfSIP5Q47Gf8CrQ&cad=rja">计算字符串相似度算法——Levenshtein</a> </p>    <h3></h3>    <p>这里的算法区别在于:存差异值的数组由上文中的二维数组,变成这个实现的两个一维数组,并通过不断的交换数值来实现。</p>    <h3>1.2源码理解</h3>    <pre class="brush:javascript; toolbar: true; auto-links: false;">//计算两个字符串的差异值 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为短字符串,方便后面处理        &nbsp;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]; }</pre>差异值算出来后,除以字符串长度就能算出相似度。