【问题标题】:C# remove duplicates from jagged arrayC#从锯齿状数组中删除重复项
【发布时间】:2020-01-12 09:28:10
【问题描述】:

我正在为大学编写算法。除了最后一件事,我几乎拥有一切。 我现在有锯齿状的数字数组,这个数组的例子:

[0][1]
[1][11,12]
[2][3,7,11,15]
[3][6,7,10,11]

我需要删除重复项,例如删除所有下一行中的每个数字,这些数字存在于上一行中。 输出应该是这样的:

[0][1]
[1][11,12]
[2][3,7,15]
[3][6,10]

我尝试过这样的事情:

for (int i = 0; i <= numbers.Length + 1; i++)
{
    int size = numbers[i].Length;
    for (int j = 0; j < size; j++)
    {
        if (numbers[i][numbers[i].Length] != numbers[i + 1][numbers[i + 1].Length])
        {
            newNumbers[i][j] = numbers[i][j];
        }
    }
}

但它并没有按应有的方式工作。

【问题讨论】:

  • [0] [1] [2] [3] 是数组的一部分,还是只是索引?
  • 为什么要在 if 语句中比较长度?
  • 这是导致问题的 if 语句和 if 语句中的内容。确保正确使用 i 和 j 变量来操作数组。
  • 您可能需要一个二级数​​据结构(例如字典)来存储重复的数字及其位置。您的数组的第一遍填充此字典 - 第二遍使用此信息删除重复项
  • Pavel Anikhouski 它们是索引。

标签: c# arrays duplicates


【解决方案1】:

您可以使用 System.Linq 命名空间中的 Except 方法来解决它。

在每次循环迭代时,都会遍历所有下一行,并获取这些行与当前行之间的差异,然后将其重新分配回去。这是可能的,因为jagged array 是一个数组,其元素是数组,并且您对所有项目都有相同的int 数据类型

int[][] jaggedArray = new int[4][];

jaggedArray[0] = new[] { 1 };
jaggedArray[1] = new[] { 11, 12 };
jaggedArray[2] = new[] { 3, 7, 11, 15 };
jaggedArray[3] = new[] { 6, 7, 10, 11 };

for (int i = 0; i < jaggedArray.Length; i++)
{
    var currentRow = jaggedArray[i];
    for (int j = i + 1; j < jaggedArray.Length; j++)
    {
        var result = jaggedArray[j].Except(currentRow);
        jaggedArray[j] = result.ToArray();
    }
}

如果打印结果数组

foreach (var array in jaggedArray)
{
    foreach (var item in array) 
        Console.Write($"{item} ");

    Console.WriteLine();
}

输出如下

【讨论】:

  • 如果不相邻的行中有重复的数字会起作用吗?
  • OP 提到 删除所有下一行中的每个数字,即存在于上一行中。 内部 for 循环遍历所有下一行,直到数组结束,在主循环的每次迭代中
  • @PavelAnikhouski 它正在工作,非常感谢。你只是让我免于坐下几个小时并试图实现这一目标。
【解决方案2】:
public static int[][] RemoveDuplicates(this int[][] data)
{
    var result = new int[data.Length][];
    var used = new List<int>();

    for (int i = 0; i < data.Length; i++)
    {
        var hashSet = new HashSet<int>(data[i].Except(used));
        result[i] = hashSet.ToArray();
        used.AddRange(hashSet);
    }
    return result;
}

【讨论】:

    猜你喜欢
    • 2021-05-04
    • 2015-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-10
    • 1970-01-01
    • 1970-01-01
    • 2016-12-19
    相关资源
    最近更新 更多