【问题标题】:How would I consider two strings equal if they somewhat match如果两个字符串有些匹配,我如何认为它们相等
【发布时间】:2015-07-30 16:50:58
【问题描述】:

有一个难题可以帮助我。我想比较两个字符串,如果它们以设定的百分比相互匹配,则将它们作为相等传递。

这就是我的意思……

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

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

所以一个例子是 String1 = 你好世界 String2 = Hello 2 World

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

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

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

这看起来真的很酷,我只是需要一些帮助。

【问题讨论】:

  • 我建议您查看en.wikipedia.org/wiki/Levenshtein_distance,然后为它搜索众多 Java 示例之一。
  • 您是否考虑过使用Hamming distance
  • 太棒了!谢谢,这应该可以完成工作。
  • 与 Dlrow Olleh 相比,这种代码是否适用于诸如 Hello World 之类的混乱词?
  • 什么是“这种代码”?

标签: java string compare string-comparison


【解决方案1】:

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

org.apache.commons.lang3.StringUtils 中提供了 Levenshtein 距离方法。

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

【讨论】:

  • 谢谢!我从该链接的第二个回复中得到了它。
【解决方案2】:

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

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

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    • 2018-09-17
    • 1970-01-01
    • 1970-01-01
    • 2021-05-22
    • 1970-01-01
    相关资源
    最近更新 更多