你在问什么是有点不平凡的。你的答案的核心是另一个问题:
你如何定义“类似”?
您需要指定一些规则来管理这个规则,以及一些与规则相关的阈值,我不确定你甚至已经考虑过了。例如,下面是一个简单的解决方案(在我的漂亮或效率上简单易行,我只是把它们放在一起非常快,所以代码可能有点凌乱......我更关心的是回答问题...你可以自己重构它,如果你想)。有一个%75的阈值,在这个阈值中,我检查了较小字符串中的字符数是否与较大字符串的%75匹配(注意:java.lang.String是final的,所以不能扩展它) :
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
public class MyString{
private static final float THRESHOLD = (float) 0.75;
private final Logger logger = Logger.getLogger(MyString.class.getName());
private String str;
private Map <Character, Integer> strMap;
public MyString(String str){ //java.lang.String is final...
this.str = str;
this.strMap = this.generateCharMap(str);
}
public void executeTestForSophiaZhuang(){
{
MyString str1 = new MyString("JAVA IS A PROGRAMMING LANGUAGE");
String str2 = "JAVA IS A PROGRAMMING LANGUAG X";
logger.log(Level.INFO, "String {0}.isSimilar({1}) == {2}", new Object[]{
str1.toString(), str2, str1.isSimilar(str2)});
}
{
MyString str1 = new MyString("JAVA IS A PROGRAMMING LANGUAG X");
String str2 = "JAVA IS A PROGRAMMING LANGUAGE";
logger.log(Level.INFO, "String {0}.isSimilar({1}) == {2}", new Object[]{
str1.toString(), str2, str1.isSimilar(str2)});
}
{
MyString str1 = new MyString("JAVA IS A PROGRAMMING LANGUAGE");
String str2 = "I ATE THE CAKE";
logger.log(Level.INFO, "String {0}.isSimilar({1}) == {2}", new Object[]{
str1.toString(), str2, str1.isSimilar(str2)});
}
{
MyString str1 = new MyString("I ATE THE CAKE");
String str2 = "JAVA IS A PROGRAMMING LANGUAGE";
logger.log(Level.INFO, "String {0}.isSimilar({1}) == {2}", new Object[]{
str1.toString(), str2, str1.isSimilar(str2)});
}
}
@Override
public String toString(){
return this.str;
}
private Map <Character, Integer> generateCharMap(String str){
Map <Character, Integer> map = new HashMap<>();
Integer currentChar;
for(char c: str.toCharArray()){
currentChar = map.get(c);
if(currentChar == null){
map.put(c, 1);
} else {
map.put(c, currentChar+1);
}
}
return map;
}
public boolean isSimilar(String compareStr){
Map <Character, Integer> compareStrMap = this.generateCharMap(compareStr);
Set <Character> charSet = compareStrMap.keySet();
int similarChars = 0;
int totalStrChars = this.str.length();
float thisThreshold;
if(totalStrChars < compareStrMap.size()){
totalStrChars = compareStr.length();
}
Iterator it = charSet.iterator();
char currentChar;
Integer currentCountStrMap;
Integer currentCountCompareStrMap;
while(it.hasNext()){
currentChar = (Character)it.next();
currentCountStrMap = strMap.get(currentChar);
if(currentCountStrMap != null){
currentCountCompareStrMap = compareStrMap.get(currentChar);
if (currentCountCompareStrMap >= currentCountStrMap){
similarChars += currentCountStrMap;
} else {
similarChars += currentCountCompareStrMap;
}
}
}
thisThreshold = ((float) similarChars)/((float) totalStrChars);
Logger.getLogger(MyString.class.getName()).log(Level.INFO, "similarChars: {0}, totalStrChars: {1}, thisThreshold: {2}", new Object[]{similarChars, totalStrChars, thisThreshold});
if(thisThreshold > THRESHOLD){
return true;
}
return false;
}
}
我想你会想要做的是定义类似之前,你尝试定义isSimilar方法,虽然。
你需要学习java的基础知识。 – afzalex 2014-10-19 01:32:21
请参阅这篇文章。 http://stackoverflow.com/questions/955110/similarity-string-comparison-in-java – bhugo313 2014-10-19 01:33:18
@HugoBauer:考虑把这个问题标记为该问题的重复(如果你认为是这样)。 – 2014-10-19 01:34:46