利用StringUtils計算兩個字符串相似度

jopen 12年前發布 | 72K 次閱讀 Java開發 StringUtils

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];

}</pre>差異值算出來后,除以字符串長度就能算出相似度。

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!