找出两个字符串之间的区别

use*_*526 20 java string comparison

假设我有两个长串.它们几乎相同.

String a = "this is a example"
String b = "this is a examp"
Run Code Online (Sandbox Code Playgroud)

以上代码仅作为示例.实际字符串很长.

问题是一个字符串比另一个字符串多2个字符.

我如何检查这两个字符是哪个?

JRL*_*JRL 26

您可以使用StringUtils.difference(String first,String second).

这就是他们实现它的方式:

public static String difference(String str1, String str2) {
    if (str1 == null) {
        return str2;
    }
    if (str2 == null) {
        return str1;
    }
    int at = indexOfDifference(str1, str2);
    if (at == INDEX_NOT_FOUND) {
        return EMPTY;
    }
    return str2.substring(at);
}

public static int indexOfDifference(CharSequence cs1, CharSequence cs2) {
    if (cs1 == cs2) {
        return INDEX_NOT_FOUND;
    }
    if (cs1 == null || cs2 == null) {
        return 0;
    }
    int i;
    for (i = 0; i < cs1.length() && i < cs2.length(); ++i) {
        if (cs1.charAt(i) != cs2.charAt(i)) {
            break;
        }
    }
    if (i < cs2.length() || i < cs1.length()) {
        return i;
    }
    return INDEX_NOT_FOUND;
}
Run Code Online (Sandbox Code Playgroud)

  • 据我所知,这不会返回不同的字符,而只返回字符串不再匹配的整个字符串... (10认同)
  • @brimborium所以也许你应该澄清你的问题。我认为这个答案非常适合您原来的问题。 (2认同)

ccu*_*ccu 14

要找到2个字符串之间的区别,您可以使用StringUtils类和差异方法.它比较两个字符串,并返回它们不同的部分.

 StringUtils.difference(null, null) = null
 StringUtils.difference("", "") = ""
 StringUtils.difference("", "abc") = "abc"
 StringUtils.difference("abc", "") = ""
 StringUtils.difference("abc", "abc") = ""
 StringUtils.difference("ab", "abxyz") = "xyz"
 StringUtils.difference("abcde", "abxyz") = "xyz"
 StringUtils.difference("abcde", "xyz") = "xyz"
Run Code Online (Sandbox Code Playgroud)

请参阅:https://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/StringUtils.html


Kil*_*oth 13

如果没有通过遍历字符串你只能知道它们是不同的,而不是在那里 -而只有当他们具有不同的长度.如果你真的需要知道不同的字符是什么,你必须串联两个字符串并比较相应位置的字符.


Gib*_*olt 11

要直接获取更改的部分,而不仅仅是结尾,您可以使用 Google 的Diff Match Patch

List<Diff> diffs = new DiffMatchPatch().diffMain("stringend", "stringdiffend");
for (Diff diff : diffs) {
  if (diff.operation == Operation.INSERT) {
    return diff.text; // Return only single diff, can also find multiple based on use case
  }
}
Run Code Online (Sandbox Code Playgroud)

对于 Android,添加:implementation 'org.bitbucket.cowwoc:diff-match-patch:1.2'

这个包比这个功能要强大得多,它主要用于创建 diff 相关工具。


jjo*_*ler 7

以下Java代码段有效地计算了必须从相应字符串中删除(或添加到)字符串的最小字符集,以使字符串相等.这是动态编程的一个例子.

import java.util.HashMap;
import java.util.Map;

public class StringUtils {

    /**
     * Examples
     */
    public static void main(String[] args) {
        System.out.println(diff("this is a example", "this is a examp")); // prints (le,)
        System.out.println(diff("Honda", "Hyundai")); // prints (o,yui)
        System.out.println(diff("Toyota", "Coyote")); // prints (Ta,Ce)
        System.out.println(diff("Flomax", "Volmax")); // prints (Fo,Vo)
    }

    /**
     * Returns a minimal set of characters that have to be removed from (or added to) the respective
     * strings to make the strings equal.
     */
    public static Pair<String> diff(String a, String b) {
        return diffHelper(a, b, new HashMap<>());
    }

    /**
     * Recursively compute a minimal set of characters while remembering already computed substrings.
     * Runs in O(n^2).
     */
    private static Pair<String> diffHelper(String a, String b, Map<Long, Pair<String>> lookup) {
        long key = ((long) a.length()) << 32 | b.length();
        if (!lookup.containsKey(key)) {
            Pair<String> value;
            if (a.isEmpty() || b.isEmpty()) {
                value = new Pair<>(a, b);
            } else if (a.charAt(0) == b.charAt(0)) {
                value = diffHelper(a.substring(1), b.substring(1), lookup);
            } else {
                Pair<String> aa = diffHelper(a.substring(1), b, lookup);
                Pair<String> bb = diffHelper(a, b.substring(1), lookup);
                if (aa.first.length() + aa.second.length() < bb.first.length() + bb.second.length()) {
                    value = new Pair<>(a.charAt(0) + aa.first, aa.second);
                } else {
                    value = new Pair<>(bb.first, b.charAt(0) + bb.second);
                }
            }
            lookup.put(key, value);
        }
        return lookup.get(key);
    }

    public static class Pair<T> {
        public Pair(T first, T second) {
            this.first = first;
            this.second = second;
        }

        public final T first, second;

        public String toString() {
            return "(" + first + "," + second + ")";
        }
    }
}
Run Code Online (Sandbox Code Playgroud)