如果它们有些匹配,我怎么会认为两个字符串相等

时间:2015-07-30 16:50:58

标签: java string compare string-comparison

有人帮助我解谜。我想比较两个字符串,如果它们以设定的百分比相互匹配,则将它们传递给它们。

这就是我所得到的......

if(string1.equals(string2,90)){
    System.out.print("Equal");
}

其中90是变量,表示两个字符串需要至少相互匹配%90。为了使事情变得更加困难,我正在测试的两个字符串具有可变数字,显示在字符串中。

所以一个例子是 String1 = Hello World String2 = Hello 2 World

该方法会认为这两个字符串相等。

我认为可行的一种方法是以某种方式取两个字符串并删除所有在另一个字符串上没有一对的字符,并根据抛出的字符数量,与您开始时的总数比例,通过或未通过测试。

这样一来,即使Hello Dlr2ow2也会被认为是对Hello World的匹配,它会抛出“2”并匹配每个剩下的字符。

这似乎真的很酷,我只需要一些帮助。

2 个答案:

答案 0 :(得分:3)

你需要找到两个字符串之间的相似性。

Levenshtein距离法可在org.apache.commons.lang3.StringUtils中找到。

一个很好的参考 - Similarity String Comparison in Java

答案 1 :(得分:0)

回答:我用这个例子让我的代码工作。

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");
  }

}