【问题标题】:How to compare 2 strings and find the difference in percentage? [closed]如何比较 2 个字符串并找出百分比差异? [关闭]
【发布时间】:2013-05-30 15:46:15
【问题描述】:

我是 C# 新手。我有 2 个字符串,它们代表国际音标中的字符。

String 1 - ðə ɻɛd fɑks ɪz hʌŋgɻi 
String 2 - ðæt ɪt foks ɪn ðʌ sʌn ɻe͡i 

现在我需要比较 String 1String 2 并找出 String 2String 1 的差异。我需要这个值作为百分比值。我怎样才能做到这一点?小代码示例对我有很大帮助。对你的帮助表示感谢。

【问题讨论】:

  • 一个 function 遍历 string 字符并返回多少相等?
  • 什么的百分比?字符串长度?准确的字符匹配?请指定规则!最重要的是,What have you tried?
  • @jszigeti,如果您认为这是重复的,您应该使用问题下方的标记按钮将其标记为这样。
  • @SteveB:完全匹配的字符

标签: c# .net string compare


【解决方案1】:

你应该知道你的String Metric是什么

另外,看看这个How to find difference between two strings - C# 问题。

这将逐个字符比较,它不同于比较字符串差异时更常见的Llevenshtein Distance

void Main()
{
    string str1 = "ðə ɻɛd fɑks ɪz hʌŋgɻi";
    string str2 = "ðæt ɪt foks ɪn ðʌ sʌn ɻe͡i";
    Console.WriteLine(StringCompare(str1,str2)); //34.6153846153846
    Console.WriteLine(StringCompare("same","same")); //100
    Console.WriteLine(StringCompare("","")); //100
    Console.WriteLine(StringCompare("","abcd")); //0  
}

static double StringCompare(string a, string b)
{
    if (a == b) //Same string, no iteration needed.
        return 100;
    if ((a.Length == 0) || (b.Length == 0)) //One is empty, second is not
    {
        return 0;
    }
    double maxLen = a.Length > b.Length ? a.Length: b.Length;
    int minLen = a.Length < b.Length ? a.Length: b.Length;
    int sameCharAtIndex = 0;
    for (int i = 0; i < minLen; i++) //Compare char by char
    {
        if (a[i] == b[i])
        {
            sameCharAtIndex++;
        }
    }
    return sameCharAtIndex / maxLen * 100;
}

【讨论】:

  • Levenshtein 距离 +1,喜欢学习新事物!
  • 嗯,这很有趣。在您的示例中,您也在按字符检查长度和字符,对吗?
  • 在您的代码中,如果字符串彼此不相等,b.length 怎么可能等于零?
  • @Sayse,你是对的,我后来添加了相等的测试。谢谢,现在改进了。
  • @Knight,该函数只是逐个字符地执行,并返回相等字符的百分比。在 100% 的情况下,我检查字符串是否相等以提高效率。
【解决方案2】:

类似的东西

string str1 = "ðə ɻɛd fɑks ɪz hʌŋgɻi";
string str2 = "ðæt ɪt foks ɪn ðʌ sʌn ɻe͡i";

char[] str1Char = str1.ToCharArray();
char[] str2Char = str2.ToCharArray();

int matchCount = 0;
int unmatchedCount = 0;


for (int x = 0; x>= str1Char.Length || x >= str2Char; x++;)
{
   if (str1Char[x] == str2Char[x])
      matchCount++;
   else
      unmatchedCount++;
}

int longestString = str1Char.Length;
if (str2Char.Length > longestString )
    longestString = str2Char.Length;

int perc = (matchCount/longestString )*100;

如果第一个字符串比第二个字符串短,但你得到了 jist,这将失败

【讨论】:

  • 不要认为这会编译,你切换了循环的迭代器和条件部分。
  • @Pierre-LucPineault,该死的总是那样做。为什么 SO 没有智能感知?
  • @Liam 如果两者相等,您可能不必遍历它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-11
  • 1970-01-01
  • 2022-01-03
  • 1970-01-01
相关资源
最近更新 更多