我想使用Damerau与Levenshtein距离比较字符串列表
目前我有:
char lastchar = (char)('z'+1);
SimilarStrings similarStrings = new SimilarStrings();
List<String> listString = new List<string>();
listString.Add("Rammstein");
listString.Add("Ramstein");
listString.Add("Rammsten");
listString.Add("Metallica");
listString.Add("Metalica");
listString.Add("Metaica");
for (int i = 0; i < listString.Count(); i++)
{
for(int n = 0; n < listString.Count(); n++)
{
String str1 = String.Copy(listString[i]);
String str2 = String.Copy(listString[n]);
Console.Write(str1); Console.Write(" to "); Console.Write(str2 + "\n");
int DADistance = SimilarStrings.damerauLevenshteinDistance(str1, str2, (int)lastchar);
Console.WriteLine(DADistance);
}
}
这基本上很好用,唯一的问题是每次比较都做了两次。这意味着例如将“Rammstein”与“Metallica”进行比较,然后再将“Metallica”与“Rammstein”进行比较。一半的比较就足够了。但是我该如何以良好的方式做到这一点?我只能想到一些复杂的方法。
答案 0 :(得分:4)
标准方法是从外循环索引加一个内循环。
for (int i = 0; i < listString.Count(); i++)
for (int n = i + 1; n < listString.Count(); n++)
假设您不想将每个字符串与自身进行比较 - 如果您这样做,请删除+ 1
。
这是逻辑的一个例子。如果您的列表是:a b c d
,则需要将a
与:
a <> b
a <> c
a <> d
对于b
,您不需要将b
与a
进行比较,因为您已将a
与所有内容进行了比较。所以你可以从c
开始:
b <> c
b <> d
对于c
,您已将a
和b
与所有内容进行了比较,因此您可以从d
开始:
c <> d
因此,每个元素只需要在列表中之后与元素进行比较 - 这就是上面嵌套循环所表达的内容。
答案 1 :(得分:1)
这可以防止重复比较
for (int i = 0; i < listString.Count(); i++)
{
for(int n = i + 1; n < listString.Count(); n++)
{
...
}
}