【问题标题】:Can't find unique words找不到独特的词
【发布时间】:2019-04-26 22:29:58
【问题描述】:

谁能告诉我我的代码有什么问题? 基本上,在比较words1words2 之后,我只需要添加从words1uniques 列表的唯一词。 在if 语句中,如果我删除!,那么它会找到匹配的单词(与我需要的相反)

    List<string> Unique(string lines1 ,string lines2,  char[] separators)
    {
        string[] words1 = lines1.Split(separators, StringSplitOptions.RemoveEmptyEntries);
        string[] words2 = lines2.Split(separators, StringSplitOptions.RemoveEmptyEntries);
        List<string> uniques = new List<string>();

        for (int i = 0; i < words1.Length; i++)
        {
            bool match;
            for (int x = 0; x < words2.Length; x++)
            {
                if (!words1[i].Equals(words2[x]))
                {
                    match = true;
                    uniques.Add(words1[i]);
                    break;
                }
                else
                {
                    match = false;
                }
            }
        }

        return uniques;
    }

【问题讨论】:

  • 一旦发现不匹配的内容,即使之前匹配过,也会将其标记为唯一。您必须检查 所有 单词,并且只有当 nothing 匹配时,它才是唯一的
  • 我猜你这样做是为了学习——否则你可以使用 Linq 并做var uniques = words1.Except(words2).ToList();
  • 如果遇到这个问题并且您实际上需要“列表中不在另一个列表中的项目” - stackoverflow.com/questions/3944803/…

标签: c# string-matching


【解决方案1】:

你可以对你的循环做一些小的改动

    for (int i = 0; i < words1.Length; i++)
    {
        bool match=false;
        for (int x = 0; x < words2.Length; x++)
        {
            if (words1[i].Equals(words2[x]))
            {
                match = true;
                break;
            }

        }
        if(!match && uniques.Contains(words1[i]))
        { 
            uniques.Add(words1[i]);
        }
        { 
        uniques.Add(words1[i]);
        }
    }

为了使您的代码更短,您可以使用 LINQ

List<string> Unique(string lines1 ,string lines2,  char[] separators)
{    
string[] words1 = lines1.Split(separators, StringSplitOptions.RemoveEmptyEntries);
string[] words2 = lines2.Split(separators, StringSplitOptions.RemoveEmptyEntries);
return words1.Except(words2).ToList();
}

【讨论】:

  • 还不知道 LINQ,但是您对我的代码的编辑有效!非常感谢!
  • 请注意,这段代码显然没有添加“唯一”词 - words1 = {"foo","foo","foo"}, words2={"bar"} 将导致 {"foo","foo","foo"} 不太可能被大多数人称为唯一词列表...
  • @AlexeiLevenkov,更新为检查现有列表中的唯一性:)
【解决方案2】:

使用两个嵌套循环的性能较差,为 O(n2)。使用集合Union

return words1
    .Union(words2)
    .ToList();

【讨论】:

  • 使用OrderBy 的性能较差,为 O(n log n)(非常不清楚为什么要添加一个)。问题似乎是关于实现ExceptDistinct(不确定Union 如何符合OP 的要求)。
  • 据我了解,OP 希望通过消除重复来组合两个单词列表。 Union 执行集合并集,即删除重复项。我删除了OrderBy,但是 O(n log n) 比 O(n^2) 好得多。
猜你喜欢
  • 1970-01-01
  • 2017-02-14
  • 1970-01-01
  • 2020-07-19
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多