C# удаление дубликатов из зубчатого массива - PullRequest
3 голосов
/ 12 января 2020

Я пишу алгоритм для университета. И у меня есть почти все, кроме последней вещи. Теперь у меня есть зубчатый массив чисел, пример этого массива:

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

И мне нужно удалить дубликаты, такие как удалить каждое число из всех следующих строк, которые присутствуют в строке prev ios. Вывод должен выглядеть примерно так:

[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];
        }
    }
}

Но это не работает так, как должно.

Ответы [ 2 ]

3 голосов
/ 12 января 2020

Вы можете решить эту проблему, используя метод Except из System.Linq. На каждой итерации l oop вы go проходите по всем следующим строкам, получаете разницу между этими строками и текущей и переназначаете ее. Это возможно, потому что неровный массив - это массив, элементы которого являются массивами, и у вас одинаковый тип данных 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();
}

Вывод будет следующим:

result

1 голос
/ 13 января 2020
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;
}
...