Java 使用levenstein编辑距离比较类似字符串时遇到了问题

Java 使用levenstein编辑距离比较类似字符串时遇到了问题,java,string,Java,String,我使用levenstein编辑距离来查找两个字符串的相似程度。这两个字符串是这样的。第一个是两个中较长的一个,如果有的话;此外,我还想比较另一个非截断非修改字符串。第二个字符串可能在结尾处被截断,并且缺少字符。可以有多个唯一的字符串1和字符串2 我在第二个字符串列表中读取,每个字符串都包含在一行中,格式如下 “[string two]-$0.00”所以它是string two加上空格、破折号、空格,然后是价格 所以我有一个第二个字符串的列表(格式),我有两个选项。删除价格和“-”或保留在那里

我使用levenstein编辑距离来查找两个字符串的相似程度。这两个字符串是这样的。第一个是两个中较长的一个,如果有的话;此外,我还想比较另一个非截断非修改字符串。第二个字符串可能在结尾处被截断,并且缺少字符。可以有多个唯一的字符串1和字符串2

我在第二个字符串列表中读取,每个字符串都包含在一行中,格式如下 “[string two]-$0.00”所以它是string two加上空格、破折号、空格,然后是价格

所以我有一个第二个字符串的列表(格式),我有两个选项。删除价格和“-”或保留在那里

  • 如果我移除它。我读入每个字符串2,并用分隔符“$”标记它。我不知道任何字符串2有多长,所以我必须先做一个stringtwo.removeAll(“-”)来去掉破折号,然后再做一个.trim()来去掉空白。如果第二串中有一个破折号,它也会被自动移除。因此,我得到了精确字符串(levenstein=0)、被截断但仍然精确的字符串(字符串在长度为string one-levenstein之前相同)、被截断并缺少整数数量的破折号(破折号之间的几处字符串相同,如果被截断,最后也会缺少),或未被截断,但缺少整数个破折号

  • 如果我离开它。仍然读取每个字符串2,并用分隔符“$”标记。现在我有了字符串2的格式“[string two]-”。因此,所有的levenstein距离都将被关闭3。这里的问题是,如果我有一个字符串1,比如“狗粮很好吃”,而我尝试比较的字符串2是“狗粮很好吃-”levD=3,但这是相同的levD,就像我有字符串2“狗粮很好吃-”

正如您所看到的,这两种选择都会产生问题。在我的程序中,我似乎无法克服这些问题,无法尝试将字符串2的输入列表与字符串1的列表相匹配


任何人都能找到更好的方法吗?有没有其他字符串比较器可以用来减少问题?

试试这个:应该在每个字符串中找到的最后一个“-”处截断字符串,同时保持字符串的其余部分完好无损

StringTwo.substring(0, StringTwo.lastIndexOf("-")).trim();
这些字符串操作可能非常昂贵,因此如果您使用大量字符串,您可能会考虑其他优化

此外,此解决方案是脆弱的,因为它硬编码值以确定在代码中修剪的位置。这可以在其他地方定义并传入,以便可以更改

一旦您的代码工作得比较好和安全,下一步请尝试查看Apache中的StringUtils,它具有更广泛的字符串操作

org.apache.commons.lang.StringUtils from Apache Commons Lang

啊!真不敢相信我居然没想到。。。。你把我的一生藏在哪里了。(至少我现在会有一个情人节礼物)。这可能会奏效。谢谢我的QYL4!