在 Java 或 Kotlin 中,有哪些方法可以找到两个字符串之间的确切区别?

What are the ways to find the exact difference between two strings in Java or Kotlin?

提问人:Varun A M 提问时间:8/14/2023 更新时间:8/14/2023 访问量:59

问:

我想与字符串进行比较并打印差异。我还想打印两个字符串之间的相似度百分比。我正在寻找 Java 或 Kotlin 的解决方案。任何潜在客户将不胜感激。

这是问题的示例。

  1. 假设第一个字符串是“Java is very easy”
  2. 第二个字符串是“Jav is ver easie”

现在,我想以编程方式发现“Java”中缺少字母 a,而 easy 是不同的。我想直观地让读者知道他们犯了错误的字母。

我基本上是在为 android 应用程序寻找这个。任何潜在客户将不胜感激。

java android 字符串 kotlin

评论

1赞 Gabe Sechan 8/14/2023
这个问题的好答案实际上可能非常困难。特别是如果你希望能够做一些事情,比如找到一个细微的差异(例如,一个缺失的单词),但要认识到字符串的其余部分是相同的。我会研究 git、diff 实用程序和其他类似开源项目中使用的 diffing 算法,看看是否有可以使用的东西。
0赞 Codo 8/14/2023
这就是 diff 实用程序的作用。该算法(在引用的 Wiki 页面上进行了解释)是几篇研究论文和计算机科学课程的主题。这不是微不足道的。您可以轻松找到多个开源 Kotlin 实现。

答:

0赞 YACINE EL GOUB 8/14/2023 #1

如果您想了解两个字符串的字符之间的确切差异,可以使用自己的字符串修改以下代码中的“str1”和“str2”。

 public static void compareChar() {
        String str1 = "i hate java so match";
        String str2 = "i hate java so match";
        char[] charStr1 = str1.toCharArray();
        char[] charStr2 = str2.toCharArray();
        System.out.println("position        str1        str2");


        if (charStr1.length > charStr2.length) {

            for (int i = 0; i < charStr2.length; i++) {
                if (charStr1[i] != charStr2[i]) {
                    System.out.println(i + "       " + charStr1[i] + "        " + charStr1[i] + "      Different");
                } else {
                    System.out.println(i + "       " + charStr1[i] + "        " + charStr1[i] + "      Not Different");
                }
            }
            for (int i = charStr2.length; i < charStr1.length; i++) {
                System.out.println(i + "       " + charStr1[i] + "         " + "       Different");
            }

        } else if (charStr1.length < charStr2.length) {
            for (int i = 0; i < charStr1.length; i++) {
                if (charStr1[i] != charStr2[i]) {
                    System.out.println(i + "       " + charStr1[i] + "        " + charStr1[i] + "      Different");
                } else {
                    System.out.println(i + "       " + charStr1[i] + "        " + charStr1[i] + "      Not Different");
                }
            }
            for (int i = charStr1.length; i < charStr2.length; i++) {
                System.out.println(i + "       " + charStr2[i] + "         " + "       Different");
            }

        } else {
            for (int i = 0; i < charStr1.length; i++) {
                if (charStr1[i] != charStr2[i]) {
                    System.out.println(i + "       " + charStr1[i] + "        " + charStr1[i] + "      Different");
                } else {
                    System.out.println(i + "       " + charStr1[i] + "        " + charStr1[i] + "      Not Different");
                }
            }
        }
    }

评论

1赞 Gabe Sechan 8/14/2023
这对于几乎相同且转置的字符串有效(将一个字母替换为另一个字母),但对于缺少字母、添加的字母或多字母错误不是很有效。它在单词级别上也根本不起作用(整个缺失的单词,但之后会恢复到相似性)。在它找到第一个错误后,如果它是丢失或添加的字母,之后的每个字母也会标记为错误。你的答案没有错,但它是算法的最简单版本,以至于在实践中几乎无法使用。