【问题标题】:Comparing Sentences in Java比较 Java 中的句子
【发布时间】:2012-09-28 06:34:16
【问题描述】:

我想比较两个句子(句子 A 和 B),这样程序就会输出句子 A 对句子 B 所做的更改。例如:

句子A:It's a lovely day today.
B句:It's a very lovely day today, isnt it?

输出:It's a [I:very] lovely day today [C:./,] [I:isnt it?]

其中:
I = 已插入,
C = 已更改

PS:我还没有开始编码,因为我想收集一些关于如何最好地实施这个案例的想法。

【问题讨论】:

标签: java string compare


【解决方案1】:

我想出了下面的代码和这个问题。

条件不考虑

  1. 从任何列表中删除项目
  2. 第一个字符差异
  3. diff 项重复

如果您有任何疑问,请检查并告诉我。

public static void main(String[] args) {

    String str1 = "It's a lovely day today.";
    String str2 = "It's a very lovely day today, isnt it?";
    StringBuilder builder = new StringBuilder();
    StringBuilder added = new StringBuilder();
    StringBuilder changed = new StringBuilder();

    for (int i = 0; i < str1.length(); i++)
        for (int j = 0; j < str2.length(); j++) {
            if (str1.charAt(i) == str2.charAt(j)) {
                if (added.length() > 0) {
                    builder.append("[I:" + added.toString() + "]");
                    added = new StringBuilder();
                }
                if (changed.length() > 0) {
                    changed.append("[C:" + changed.toString() + "]");
                    changed = new StringBuilder();
                }
                // skip as there is no difference.
                builder.append(str1.charAt(i));
                i++;
                // check if index -1 chars are equal then there is
                // difference start
            } else if (str1.charAt(i - 1) == str2.charAt(j - 1)) {

                // check if end of line
                if ((i + 1 == str1.length())
                        || (str1.charAt(i + 1) == str2.charAt(j + 1))) {

                    changed.append(str1.charAt(i));
                    changed.append("/");
                    changed.append(str2.charAt(j));
                    j++;
                    // everything is added
                    if (i + 1 == str1.length()) {
                        while (j < str2.length() - 1)
                            added.append(str2.charAt(j++));
                    }

                    continue;
                }

                // Go until next equal found
                while (!(str1.charAt(i) == str2.charAt(j))
                        && j < str2.length() - 1) {
                    added.append(str2.charAt(j++));
                }
                j--;

            }
        }
    if (changed.length() > 0) {
        builder.append("[C:" + changed.toString() + "]");
    }
    if (added.length() > 0) {
        builder.append("[I:" + added.toString() + "]");
    }

    System.out.println(builder.toString());

}

输出

It's a [I:very ]lovely day today[C:./,][I: isnt it]

【讨论】:

  • 嘿,这很好用!谢谢!如果我包含删除的单词,是否会有很大的修改,即输出也会通知我们那些在句子 B 中被删除的单词?
  • 查找字符删除很容易发现单词删除很棘手。你可以像我找到插入一样找到删除,但这次外循环将在第二个字符串上,而内循环将在第一个字符串上。
  • 所以如果我包括删除单词,除了上面的循环之外,我还必须做另一个嵌套循环?
猜你喜欢
  • 1970-01-01
  • 2015-07-22
  • 2015-06-26
  • 1970-01-01
  • 2011-06-27
  • 1970-01-01
  • 2017-09-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多