package com.tievd.jyz.util;
|
|
import org.apache.commons.collections.map.HashedMap;
|
|
import java.util.Map;
|
|
/**
|
* Author: wqy
|
* Date: 2023/5/8 17:37
|
*/
|
public class StringCampareUtil {
|
|
//相似等级 1严格相等 2相似 3加权相似
|
public static int grade = 1;
|
|
private static int perScore = 10;
|
|
public static Map<Character, String> similarMap = new HashedMap();
|
|
static {
|
similarMap.put('A', "H41");
|
similarMap.put('H', "A4N");
|
similarMap.put('4', "AH1");
|
similarMap.put('1', "17");
|
similarMap.put('7', "1");
|
similarMap.put('6', "890");
|
similarMap.put('9', "860");
|
similarMap.put('8', "96B");
|
similarMap.put('B', "968");
|
similarMap.put('2', "Z");
|
similarMap.put('Z', "2");
|
similarMap.put('0', "OQD");
|
similarMap.put('O', "0QD");
|
similarMap.put('D', "GO0Q");
|
similarMap.put('G', "DO0Q");
|
similarMap.put('Q', "DO0G");
|
similarMap.put('M', "HNMW");
|
similarMap.put('N', "HNM");
|
similarMap.put('W', "NM");
|
}
|
|
//返回直接长度 当且仅当grade=1时使用
|
public static int stringLCS(String str1, String str2) {
|
return LCS(str1, str2) / perScore;
|
}
|
|
private static int LCS(String str1, String str2) {
|
str1 = 0 + str1;
|
str2 = 0 + str2;
|
char[] charArr1 = str1.toCharArray();
|
char[] charArr2 = str2.toCharArray();
|
int len1 = charArr1.length;
|
int len2 = charArr2.length;
|
int lcs[][] = new int[len1][len2];
|
for (int i = 0; i < len1; i++) {
|
for (int j = 0; j < len2; j++) {
|
if (i == 0 || j == 0) {
|
lcs[i][j] = 0;
|
} else {
|
int dVal = beSimilar(charArr1[i], charArr2[j]);
|
if (dVal > 0) {
|
lcs[i][j] = lcs[i - 1][j - 1] + dVal;
|
} else {
|
lcs[i][j] = Math.max(lcs[i][j - 1], lcs[i - 1][j]);
|
}
|
}
|
}
|
}
|
return lcs[len1 - 1][len2 - 1];
|
}
|
|
/**
|
* 比较相似或相等
|
* @param c1
|
* @param c2
|
* @return
|
*/
|
private static int beSimilar(char c1, char c2) {
|
if (c1 == c2) {
|
return perScore;
|
} else if (similarMap.getOrDefault(c1, "").contains("" + c2)) {
|
switch (grade) {
|
case 1: return 0;
|
case 2: return perScore;
|
case 3: return (int) (perScore*0.7);
|
}
|
}
|
return 0;
|
}
|
|
/**
|
* 根据grande等级,获取相似度百分值
|
* @return
|
*/
|
public static double scoreLCS(String str1, String str2) {
|
int len = Math.min(str1.length(), str2.length());
|
if (len==0) return 0;
|
int lcs = LCS(str1, str2);
|
return 1.0 * lcs / perScore /len;
|
}
|
|
}
|