我做了一些研究,发现一些主题会检查字符串是否是字符串中的子字符串,并选择与指定字符串最接近的字符串,但是如何检查一个字符串是否类似于另一个并提供正确/错误的响应?即:
String 1: JAVA IS A PROGRAMMING LANGUAGE
String 2: JAVA IS A PROGRAMMING LANGUAG X
这将返回“true”
String 1: JAVA IS A PROGRAMMING LANGUAGE
String 2: I ATE THE CAKE
这将返回“false”
谢谢。
最佳答案
你问的问题有点不简单。您答案的核心是另一个问题:
How do you define "similar"?
您需要指定一些管理此问题的规则,以及与这些规则相关的一些阈值,我不确定您是否已经考虑过。
例如,下面是一个简单的解决方案(在美观或效率上请对我宽容一些,我只是很快地将其组合在一起,因此代码可能有点困惑......我更关心回答问题...如果你愿意,你可以自己重构它)。有一个阈值 %75,在该阈值中,我检查较小字符串中的字符数是否与较大字符串中的字符数匹配最多 %75%(注意:java.lang.String 是最终的,因此无法扩展它) :
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 - 检查一个字符串是否与另一个字符串相似,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26446348/