Java 检查一个字符串是否与另一个字符串相似

Java 检查一个字符串是否与另一个字符串相似,java,string,Java,String,我做了一些研究,我发现一些主题正在进行检查字符串是否是字符串中的子字符串,以及选择与指定字符串最接近的字符串,但是我如何检查一个字符串是否与另一个字符串相似并提供真/假响应?即: String 1: JAVA IS A PROGRAMMING LANGUAGE String 2: JAVA IS A PROGRAMMING LANGUAG X 这将返回一个“true” 这将返回“false” 谢谢。java中没有set函数可以实现这一点,因此您必须自己构建一个。你解决这个问题的方式完全取决于你

我做了一些研究,我发现一些主题正在进行检查字符串是否是字符串中的子字符串,以及选择与指定字符串最接近的字符串,但是我如何检查一个字符串是否与另一个字符串相似并提供真/假响应?即:

String 1: JAVA IS A PROGRAMMING LANGUAGE
String 2: JAVA IS A PROGRAMMING LANGUAG X
这将返回一个“true”

这将返回“false”


谢谢。

java中没有set函数可以实现这一点,因此您必须自己构建一个。你解决这个问题的方式完全取决于你想要达到的相似性极限

我将采用的方法是利用java提供的拆分函数,这样您就可以遍历句子中的每个单词。然后简单地将每个字符分别与另一个句子中的每个单词进行比较

创建某种比率以使失败或通过,正如我上面所说的,这将取决于您希望它的相似程度

如果您不了解如何在java中使用字符串,请浏览


编辑:您可能会感兴趣的还有一种不同的算法,下面是一个更具体的例子,说明java中没有set函数可以实现这一点,因此您必须自己构建一个。你解决这个问题的方式完全取决于你想要达到的相似性极限

我将采用的方法是利用java提供的拆分函数,这样您就可以遍历句子中的每个单词。然后简单地将每个字符分别与另一个句子中的每个单词进行比较

创建某种比率以使失败或通过,正如我上面所说的,这将取决于您希望它的相似程度

如果您不了解如何在java中使用字符串,请浏览


编辑:您可能会感兴趣的还有一种不同的算法,这里有一个更具体的例子,说明有许多方法可以确定两个字符串的相似性。其中最常见的一种是,其中的是一个例子(有几种变体和其他方法——请看一下维基百科)

Levenshtein距离计算将一个字符串更改为另一个字符串所需的更改数量。例如:

JAVA IS A PROGRAMMING LANGUAGE JAVA IS A PROGRAMMING LANGUAG X JAVA是一种编程语言 JAVA是一种编程语言 编辑距离为2:“E”更改为“”,并插入“X”

kitten sitting 小猫 坐 编辑距离为3:'k'到's','e'到'i'并插入'g'

然后您将要编写的函数可能会有一个
布尔相似(int-threshold,String-foo,String-bar)
的原型,其中threshold是允许的最大更改数,foo和bar是您要比较的两个字符串


如果您正在对单个字符串进行大量比较,您可能会考虑构造一个特殊类型的有限自动机,如果它位于构建aotma自动机时使用的字符串的某个编辑距离内,则可以接受该字符串。

有许多方法可以确定两个字符串的相似性。其中最常见的一种是,其中的是一个例子(有几种变体和其他方法——请看一下维基百科)

Levenshtein距离计算将一个字符串更改为另一个字符串所需的更改数量。例如:

JAVA IS A PROGRAMMING LANGUAGE JAVA IS A PROGRAMMING LANGUAG X JAVA是一种编程语言 JAVA是一种编程语言 编辑距离为2:“E”更改为“”,并插入“X”

kitten sitting 小猫 坐 编辑距离为3:'k'到's','e'到'i'并插入'g'

然后您将要编写的函数可能会有一个
布尔相似(int-threshold,String-foo,String-bar)
的原型,其中threshold是允许的最大更改数,foo和bar是您要比较的两个字符串


如果您正在对单个字符串进行大量比较,您可能会考虑构造一个特殊类型的有限自动机,如果它在构建aotma自动机时使用的字符串的某个编辑距离内,则该自动机可以接受该字符串。

您所问的有点不寻常。你回答的核心是另一个问题:

你如何定义“相似”

您需要指定一些规则来管理这一点,以及一些与这些规则相关联的阈值,我不确定您是否已经考虑过这些

例如,下面是一个简单的解决方案(在美观性或效率方面请对我放松,我只是很快地将其组合在一起,所以代码可能有点混乱……我更关心的是回答这个问题……如果你愿意,你可以自己重构它)。有一个阈值%75,在该阈值中,我检查较小字符串中的字符数是否与较大字符串的%75%匹配(注意:java.lang.string是最终值,因此无法扩展):

import java.util.HashMap;
导入java.util.Iterator;
导入java.util.Map;
导入java.util.Set;
导入java.util.logging.Level;
导入java.util.logging.Logger;
公共类MyString{
私有静态最终浮动阈值=(浮动)0.75;
私有最终记录器=Logger.getLogger(MyString.class.getName());
私有字符串str;
私有地图strMap;
publicMyString(stringstr){//java.lang.String是最终的。。。
this.str=str;
this.strMap=this.generateCharMap(str);
}
public void executeTestForSophiaZhuang(){
{
mystringstr1=新的MyString(“JAVA是一种编程语言”);
String str2=“JAVA是一种编程语言”;
logger.log(Level.INFO,“字符串{0}.isSimilar({1})=={2}”,新对象[]{
str1.toString(),str2,str1.isSimilar(str2)};
}
{
mystringstr1=newmystring(“JAVA是一种编程语言X”);
String str2=“JAVA是一种编程语言”;
logger.log(Level.INFO,“字符串{0}.Issimular({1