您好我有两个字符串:
String hear = "Hi My name is Deepak"
+ "\n"
+ "How are you ?"
+ "\n"
+ "\n"
+ "How is everyone";
String dear = "Hi My name is Deepak"
+ "\n"
+ "How are you ?"
+ "\n"
+ "Hey there \n"
+ "How is everyone";
我想得到听力字符串中没有的内容,即#34;嘿那里\ n"。我找到了一个方法,但在这种情况下失败了:
static String strDiffChop(String s1, String s2) {
if (s1.length() > s2.length()) {
return s1.substring(s2.length() - 1);
} else if (s2.length() > s1.length()) {
return s2.substring(s1.length() - 1);
} else {
return "";
}
}
任何人都可以帮忙吗?
答案 0 :(得分:23)
Diff Match和Patch库提供了强大的算法来执行同步纯文本所需的操作。
差异:
比较两个纯文本块并有效地返回差异列表。
匹配度:
给定搜索字符串,在纯文本块中找到最佳模糊匹配。为准确性和位置加权。
修补程序:
将补丁列表应用于纯文本。即使基础文本不匹配,也要尽最大努力应用补丁。
目前提供Java,JavaScript,Dart,C ++,C#,Objective C,Lua和Python。无论语言如何,每个库都具有相同的API和相同的功能。所有版本都有全面的测试工具。
有一个Line or word diffs维基页面,描述了如何逐行进行差异化。
答案 1 :(得分:7)
可以使用Apache Commons中的StringUtils
。这是StringUtils API。
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 == -1) {
return EMPTY;
}
return str2.substring(at);
}
public static int indexOfDifference(String str1, String str2) {
if (str1 == str2) {
return -1;
}
if (str1 == null || str2 == null) {
return 0;
}
int i;
for (i = 0; i < str1.length() && i < str2.length(); ++i) {
if (str1.charAt(i) != str2.charAt(i)) {
break;
}
}
if (i < str2.length() || i < str1.length()) {
return i;
}
return -1;
}
答案 2 :(得分:3)
我使用 StringTokenizer 来查找解决方案。以下是代码段
public static List<String> findNotMatching(String sourceStr, String anotherStr){
StringTokenizer at = new StringTokenizer(sourceStr, " ");
StringTokenizer bt = null;
int i = 0, token_count = 0;
String token = null;
boolean flag = false;
List<String> missingWords = new ArrayList<String>();
while (at.hasMoreTokens()) {
token = at.nextToken();
bt = new StringTokenizer(anotherStr, " ");
token_count = bt.countTokens();
while (i < token_count) {
String s = bt.nextToken();
if (token.equals(s)) {
flag = true;
break;
} else {
flag = false;
}
i++;
}
i = 0;
if (flag == false)
missingWords.add(token);
}
return missingWords;
}
答案 3 :(得分:2)
将字符串转换为列表,然后使用以下方法获取结果How to remove common values from two array list
答案 4 :(得分:0)
您应该使用Apache Commons的StringUtils
答案 5 :(得分:0)
我正在寻找一些解决方案,但找不到我需要的解决方案,所以我创建了一个实用工具类,用于比较两个版本的文本 - 新旧 - 并获得结果文本与标签之间的变化 - [添加]和[删除。它可以很容易地替换为您选择的荧光笔而不是此标签,例如:html标签。 string-version-comparison
任何意见将不胜感激。
*它可能不适用于长文本,因为找到相同短语的概率更高。
答案 6 :(得分:0)
如果您不想使用外部库,则可以使用以下Java代码段有效地计算差异:
/**
* Returns an array of size 2. The entries contain a minimal set of characters
* that have to be removed from the corresponding input strings in order to
* make the strings equal.
*/
public String[] difference(String a, String b) {
return diffHelper(a, b, new HashMap<>());
}
private String[] diffHelper(String a, String b, Map<Long, String[]> lookup) {
return lookup.computeIfAbsent(((long) a.length()) << 32 | b.length(), k -> {
if (a.isEmpty() || b.isEmpty()) {
return new String[]{a, b};
} else if (a.charAt(0) == b.charAt(0)) {
return diffHelper(a.substring(1), b.substring(1), lookup);
} else {
String[] aa = diffHelper(a.substring(1), b, lookup);
String[] bb = diffHelper(a, b.substring(1), lookup);
if (aa[0].length() + aa[1].length() < bb[0].length() + bb[1].length()) {
return new String[]{a.charAt(0) + aa[0], aa[1]};
} else {
return new String[]{bb[0], b.charAt(0) + bb[1]};
}
}
});
}
这种方法正在使用动态编程。它以蛮力方式尝试所有组合,但会记住已经计算出的子字符串,因此可以在O(n ^ 2)中运行。
示例:
String hear = "Hi My name is Deepak"
+ "\n"
+ "How are you ?"
+ "\n"
+ "\n"
+ "How is everyone";
String dear = "Hi My name is Deepak"
+ "\n"
+ "How are you ?"
+ "\n"
+ "Hey there \n"
+ "How is everyone";
difference(hear, dear); // returns {"","Hey there "}
difference("Honda", "Hyundai"); // returns {"o","yui"}
difference("Toyota", "Coyote"); // returns {"Ta","Ce"}
答案 7 :(得分:-1)
这个片段怎么样?
public static void strDiff(String hear, String dear){
String[] hr = dear.split("\n");
for (String h : hr) {
if (!hear.contains(h)) {
System.err.println(h);
}
}
}