如果两个字符串有些匹配,我怎么会认为它们相等
How would I consider two strings equal if they somewhat match
有人帮我解一道谜题。我想比较两个字符串,如果它们以设定的百分比相互匹配,则将它们作为相等传递。
这就是我的意思……
if(string1.equals(string2,90)){
System.out.print("Equal");
}
其中 90 是表示两个字符串需要至少相互匹配 %90 的变量。让事情变得更困难的是,我正在测试的两个字符串在字符串中显示了可变数字。
举个例子
String1 = 你好世界
String2 = Hello 2 World
该方法会认为这两个字符串相等。
我认为这是可能的一种方法是以某种方式获取两个字符串并删除所有在另一个字符串上没有成对的字符,并根据抛出的字符数,与你的总数成比例开始,通过或未通过测试。
这样即使 Hello Dlr2ow2 也会被认为是 Hello World 的匹配项,它会抛出“2”并匹配剩余的每个字符。
这看起来真的很酷,我只是需要一些帮助。
您需要找到两个字符串之间的相似性。
编辑距离法在 org.apache.commons.lang3.StringUtils 中可用。
很好的参考 - Similarity String Comparison in Java
已回答:我用这个例子来让我的代码工作。
public class StringSimilarity {
/**
* Calculates the similarity (a number within 0 and 1) between two strings.
*/
public static double similarity(String s1, String s2) {
String longer = s1, shorter = s2;
if (s1.length() < s2.length()) { // longer should always have greater length
longer = s2; shorter = s1;
}
int longerLength = longer.length();
if (longerLength == 0) { return 1.0; /* both strings are zero length */ }
/* // If you have StringUtils, you can use it to calculate the edit distance:
return (longerLength - StringUtils.getLevenshteinDistance(longer, shorter)) /
(double) longerLength; */
return (longerLength - editDistance(longer, shorter)) / (double) longerLength;
}
// Example implementation of the Levenshtein Edit Distance
// See http://rosettacode.org/wiki/Levenshtein_distance#Java
public static int editDistance(String s1, String s2) {
s1 = s1.toLowerCase();
s2 = s2.toLowerCase();
int[] costs = new int[s2.length() + 1];
for (int i = 0; i <= s1.length(); i++) {
int lastValue = i;
for (int j = 0; j <= s2.length(); j++) {
if (i == 0)
costs[j] = j;
else {
if (j > 0) {
int newValue = costs[j - 1];
if (s1.charAt(i - 1) != s2.charAt(j - 1))
newValue = Math.min(Math.min(newValue, lastValue),
costs[j]) + 1;
costs[j - 1] = lastValue;
lastValue = newValue;
}
}
}
if (i > 0)
costs[s2.length()] = lastValue;
}
return costs[s2.length()];
}
public static void printSimilarity(String s, String t) {
System.out.println(String.format(
"%.3f is the similarity between \"%s\" and \"%s\"", similarity(s, t), s, t));
}
public static void main(String[] args) {
printSimilarity("", "");
printSimilarity("1234567890", "1");
printSimilarity("1234567890", "123");
printSimilarity("1234567890", "1234567");
printSimilarity("1234567890", "1234567890");
printSimilarity("1234567890", "1234567980");
printSimilarity("47/2010", "472010");
printSimilarity("47/2010", "472011");
printSimilarity("47/2010", "AB.CDEF");
printSimilarity("47/2010", "4B.CDEFG");
printSimilarity("47/2010", "AB.CDEFG");
printSimilarity("The quick fox jumped", "The fox jumped");
printSimilarity("The quick fox jumped", "The fox");
printSimilarity("kitten", "sitting");
}
}
有人帮我解一道谜题。我想比较两个字符串,如果它们以设定的百分比相互匹配,则将它们作为相等传递。
这就是我的意思……
if(string1.equals(string2,90)){
System.out.print("Equal");
}
其中 90 是表示两个字符串需要至少相互匹配 %90 的变量。让事情变得更困难的是,我正在测试的两个字符串在字符串中显示了可变数字。
举个例子 String1 = 你好世界 String2 = Hello 2 World
该方法会认为这两个字符串相等。
我认为这是可能的一种方法是以某种方式获取两个字符串并删除所有在另一个字符串上没有成对的字符,并根据抛出的字符数,与你的总数成比例开始,通过或未通过测试。
这样即使 Hello Dlr2ow2 也会被认为是 Hello World 的匹配项,它会抛出“2”并匹配剩余的每个字符。
这看起来真的很酷,我只是需要一些帮助。
您需要找到两个字符串之间的相似性。
编辑距离法在 org.apache.commons.lang3.StringUtils 中可用。
很好的参考 - Similarity String Comparison in Java
已回答:我用这个例子来让我的代码工作。
public class StringSimilarity {
/**
* Calculates the similarity (a number within 0 and 1) between two strings.
*/
public static double similarity(String s1, String s2) {
String longer = s1, shorter = s2;
if (s1.length() < s2.length()) { // longer should always have greater length
longer = s2; shorter = s1;
}
int longerLength = longer.length();
if (longerLength == 0) { return 1.0; /* both strings are zero length */ }
/* // If you have StringUtils, you can use it to calculate the edit distance:
return (longerLength - StringUtils.getLevenshteinDistance(longer, shorter)) /
(double) longerLength; */
return (longerLength - editDistance(longer, shorter)) / (double) longerLength;
}
// Example implementation of the Levenshtein Edit Distance
// See http://rosettacode.org/wiki/Levenshtein_distance#Java
public static int editDistance(String s1, String s2) {
s1 = s1.toLowerCase();
s2 = s2.toLowerCase();
int[] costs = new int[s2.length() + 1];
for (int i = 0; i <= s1.length(); i++) {
int lastValue = i;
for (int j = 0; j <= s2.length(); j++) {
if (i == 0)
costs[j] = j;
else {
if (j > 0) {
int newValue = costs[j - 1];
if (s1.charAt(i - 1) != s2.charAt(j - 1))
newValue = Math.min(Math.min(newValue, lastValue),
costs[j]) + 1;
costs[j - 1] = lastValue;
lastValue = newValue;
}
}
}
if (i > 0)
costs[s2.length()] = lastValue;
}
return costs[s2.length()];
}
public static void printSimilarity(String s, String t) {
System.out.println(String.format(
"%.3f is the similarity between \"%s\" and \"%s\"", similarity(s, t), s, t));
}
public static void main(String[] args) {
printSimilarity("", "");
printSimilarity("1234567890", "1");
printSimilarity("1234567890", "123");
printSimilarity("1234567890", "1234567");
printSimilarity("1234567890", "1234567890");
printSimilarity("1234567890", "1234567980");
printSimilarity("47/2010", "472010");
printSimilarity("47/2010", "472011");
printSimilarity("47/2010", "AB.CDEF");
printSimilarity("47/2010", "4B.CDEFG");
printSimilarity("47/2010", "AB.CDEFG");
printSimilarity("The quick fox jumped", "The fox jumped");
printSimilarity("The quick fox jumped", "The fox");
printSimilarity("kitten", "sitting");
}
}