import java.math.BigDecimal;
/**
* 计算两个单词的差距
*/
public class EnglisOperate {
/\*\*
\* 比较两个字符串的相识度
\* 核心算法:用一个二维数组记录每个字符串是否相同,如果相同记为0,不相同记为1,每行每列相同个数累加
\* 则数组最后一个数为不相同的总数,从而判断这两个字符的相识度
\*/
private static int compare(String key, String target) {
System.out.println("--------------------比较:"+key+"=="+target);
int row = key.length();//循环目标
int col = target.length();//key
if (row == 0) {
return 0;
}
if (col == 0) {
return 0;
}
char col1; // key的
char row1; // target的
int temp; // 记录相同字符,在某个矩阵位置值的增量,
// abstract
// String key = “abundance”;
// String b = “abundant”;
int samesums = 0;
String sames = "";
for (int i0 = 0; i0 < row; i0++) {// 遍历少的
int tmp = 0;
int samesum = 0;//计相同数
String same = "";
for (int i = i0; i < row; ) {// 遍历少的,一个个去找
row1 = key.charAt(i);// 去匹配target
boolean isfinde = false;
for (int j = tmp; j < col; j++) {//循环多的,用少的在多的里来找
col1 = target.charAt(j);
if (row1 == col1) {//表字符相等
if(0 == tmp){//第一进来
tmp = j + 1;//当前在 tmp(0) + j 这个位置找到第一匹配的
}else if(j == tmp){//是上一个的下一个位置
tmp = j + 1;
}else if(j != tmp){//第二或三或四个位置没找到
break;
}
samesum++;
same += col1;
isfinde = true;
break;
}
}
if (!isfinde) {//没找到
break;
}
i++;
}
System.out.println("相同数:"+samesum+">"+same);
if(samesums < samesum){
samesums = samesum;
sames = same;
}
}
System.out.println("最终最大相同数:"+samesums+">"+sames);
return samesums;
}
/\*\*
\* 获取最小的值
\*/
private static int min(int one, int two, int three) {
return (one = one < two one : two) < three one : three;
}
/\*\*
\* 获取两字符串的相似度
\*/
public static double getSimilarityRatio(String key, String target) {
int max = Math.max(key.length(), target.length());
int sames = 0;
if(key.length() < target.length()){
sames = compare(key,target );//前少后多
}else {
sames = compare(target, key);
}
// int keylen = target.length();
System.out.println(sames+“/”+max);
if(0 == sames){
return 0;
}
double f1 = new BigDecimal((float)sames/max).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
// System.out.println(“ddd===”+f1);
return f1;
// return 0;
}
public static void main(String\[\] args) {
// abandon>>vt.离弃,丢弃;遗弃,抛弃;放弃
abdomen>>n.腹,下腹(胸部到腿部的部分)
abide>>vi.(abode,abided)(by)遵守;坚持
ability>>n.能力;本领;才能,才干;专门技能,天资
able>>a.有(能力、时间、知识等)做某事,有本事的
abnormal>>a.反常的,不正常的,不规则的
aboard>>ad.&prep.在船(飞机、车)上;ad.上船(飞机)
abolish>>vt.废除(法律、习惯等);取消
abound>>vi.大量存在;(in,with)充满,富于
about>>ad.在周围;大约 prep.关于;在周围 a.准备
above>>a.上述的 ad.在上面 prep.在…之上,高于
abroad>>ad.到国外,在国外;在传播,在流传
abrupt>>a.突然的,出其不意的;(行为等)粗鲁无礼的
absence>>n.缺乏,不存在;缺席,不在;缺席的时间
absent>>a.缺席的;缺乏的,不存在的;心不在焉的
absolute>>a.绝对的,完全的;确实的,肯定的
absorb>>vt.吸收(水、光、蒸汽等);使全神贯注
abstract>>a.抽象的 n.摘要,梗概 vt.提取;摘录要点
absurd>>a.荒谬的,荒诞的,荒唐可笑的;不合理的
abundance>>n.丰富,充裕,大量
abundant>>a.大量(充足)的;(in)丰富(富裕)的
String key = "standpoint";
String standard = "abandon";
double dis = getSimilarityRatio(key, standard);
System.out.println("相似度:" + dis);
int max = Math.max(key.length(), standard.length());
double keyrate = getdisRate(max);
if(dis >= keyrate) {//相似度
System.out.println("ok");
}
}
public static double getdisRate(int stlen){
//权重,越短,比较越高
// int stlen = standard.length();
double keyrate = 0.3;
switch (stlen){
case 2:
keyrate = 0.9;
break;
case 3:
keyrate = 0.6;
break;
case 4:
keyrate = 0.7;
break;
case 5:
case 6:
keyrate = 0.7;
break;
case 7:
case 8:
keyrate = 0.6;
break;
case 9:
case 10:
case 11:
keyrate = 0.5;
break;
case 12:
case 13:
case 14:
keyrate = 0.4;
break;
case 15:
case 16:
case 17:
case 18:
case 19:
case 20:
keyrate = 0.3;
break;
}
return keyrate;
}
}