【问题标题】:How to find or count the duplicate in multidimensional array in c# [closed]如何在c#中查找或计算多维数组中的重复项[关闭]
【发布时间】:2019-08-16 17:13:37
【问题描述】:

我正在 c# 中创建一个 2d (3 * 3) 数组,它必须计算或找到 duplicate

int[,] arr = new int[3, 3] {
   {1, 2, 6},
   {4, 1, 5},
   {6, 1, 8}
};

我预计输出有 16重复值

仅适用于使用 for 循环的初学者

【问题讨论】:

    标签: c# arrays for-loop multidimensional-array


    【解决方案1】:

    你可以试试HashSet<int>,例如

       int[,] arr = new int[3, 3] {
          {1, 2, 6 }, 
          {4, 1, 5 }, 
          {6, 1, 8 }
       };
    
       HashSet<int> unique = new HashSet<int>();
    
       foreach (var item in arr)
         if (!unique.Add(item))
           Console.WriteLine(item);  // Not unique, print it out
    

    结果:

      1
      6
      1
    

    如果我们想打印每个重复的一次,我们可以添加另一个HashSet&lt;int&gt;

       HashSet<int> unique = new HashSet<int>();
       HashSet<int> duplicates = new HashSet<int>();
    
       foreach (var item in arr)
         if (!unique.Add(item))
           duplicates.Add(item);  
    
       foreach (var item in duplicates)
         Console.WriteLine(item);
    

    最后,如果您想计算重复出现次数,我们可以将HashSet&lt;int&gt; duplicates 更改为Dictionary&lt;int, int&gt; duplicates

       HashSet<int> unique = new HashSet<int>();
    
       Dictionary<int, int> duplicates = new Dictionary<int, int>();
    
       foreach (var item in arr)
         if (!unique.Add(item)) 
           if (duplicates.TryGetValue(item, out int count))
             duplicates[i] = count + 1;
           else
             duplicates[i] = 2; 
    
       foreach (var item in duplicates)
         Console.WriteLine($"{item.Key} appears {item.Value} times");
    

    编辑:您可以将foreach 循环更改为嵌套 for 循环,例如:

    所有重复项

       for (int i = 0; i < arr.GetLength(0); ++i)
         for (int j = 0; j < arr.GetLength(1); ++j)
           if (!unique.Add(arr[i, j]))
             Console.WriteLine(arr[i, j]); 
    

    不同的重复项

       HashSet<int> duplicates = new HashSet<int>();
    
       for (int i = 0; i < arr.GetLength(0); ++i)
         for (int j = 0; j < arr.GetLength(1); ++j)
           if (!unique.Add(arr[i, j]))
             if (duplicates.Add(arr[i, j]))   // print distinct duplicate only
               Console.WriteLine(arr[i, j]); 
    

    【讨论】:

    • 谢谢,但是如何只用for循环来做到这一点
    • @Arun Kumar:你可以把 foreach 循环变成 nested for 循环(见我的编辑)
    【解决方案2】:

    大概是这样的:

    var arr = new int[3, 3]{{1,2,6}, {4,1,5}, {6,1,8}};
    var duplicates = arr
        .Cast<int>()
        .GroupBy(n => n)
        .Where(g => g.Count() > 1)
        .Select(g => g.Key)
        .ToArray();
    

    .Cast&lt;int&gt;() 使数组可用于 LINQ,.GroupBy(n =&gt; n) 按值对数字进行分组,.Where(g =&gt; g.Count() &gt; 1) 计算组中的项目数,.Select(g =&gt; g.Key) 仅返回组键 - 原始值。

    .Where(g =&gt; g.Count() &gt; 1).Select(g =&gt; g.Count()) 返回每​​个的计数,或者根据需要对组进行操作。

    【讨论】:

      【解决方案3】:

      效率不高,但您也可以将计数存储在字典中,然后打印计数大于 1 的键:

      var counts = new Dictionary<int, int>();
      
      for (int i = 0; i < arr.GetLength(0); i++)
      {
          for (int j = 0; j < arr.GetLength(1); j++)
          {
              var number = arr[i, j];
              if (!counts.ContainsKey(number))
              {
                  counts[number] = 0;
              }
              counts[number] += 1;
          }
      }
      
      foreach (var pair in counts)
      {
          if (pair.Value > 1)
          {
              Console.WriteLine(pair.Key);
          }
      }
      
      // 1
      // 6
      

      【讨论】:

        猜你喜欢
        • 2021-08-29
        • 2012-11-02
        • 2014-01-26
        • 1970-01-01
        • 2021-08-29
        • 2019-06-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多