Сортировка многомерного массива без Array.Sort или DataGrid? - PullRequest
1 голос
/ 12 апреля 2019

Я создал этот цикл for, чтобы при нажатии кнопки я мог просматривать оценки учеников, которые выглядят примерно так:

Name    Test    Basket  Destructive   Final Grade
Alex    10      10      10            10
Danny   20      20      20            20
Dave    35      40      50            40
Goerge  0       0       0             0
Hannan  0       0       0             0
Ian     0       0       0             0
Muna    0       0       0             0

Вот код для этого:

private void uiShowMarksAZButton_Click(object sender, EventArgs e)
{         
    uiMarksDisplayTextBox.Text = string.Join("\t", Columns);
    uiMarksDisplayTextBox.Text += System.Environment.NewLine;

    for (int i = 0; i < Names.Length; i++)
    {
        uiMarksDisplayTextBox.Text += Names[i];
        for (int x = 0; x < 3; x++)
        {
            uiMarksDisplayTextBox.Text += "\t" + Grade[i, x];
        }
        uiMarksDisplayTextBox.Text += "\t" + "\t" + FinalGrade[i];
        uiMarksDisplayTextBox.Text += System.Environment.NewLine;
    }
}

Я хочу иметь возможность сортировать свой стол по высшей итоговой оценке сверху и по низшей итоговой оценке снизу.это должно не только сортировать итоговую оценку, но также имя и предыдущие оценки.

Я хочу сделать это без использования Array.Sort и Datagrid.

Вот моя попытка:

private void uiShowMarks100_0Button_Click(object sender, EventArgs e)
{
    uiMarksDisplayTextBox.Text = "";
    uiMarksDisplayTextBox.Text = string.Join("\t", Columns);
    uiMarksDisplayTextBox.Text += System.Environment.NewLine;

    double temp = 0;

    for (int x = 0; x < FinalGrade.Length; x++)
    {
        for (int j = x + 1; j < FinalGrade.Length; j++)
        {
            if (FinalGrade[x] > FinalGrade[j])
            {
                temp = FinalGrade[j];
                FinalGrade[j] = FinalGrade[x];
                FinalGrade[x] = temp;
            }
            uiMarksDisplayTextBox.Text += "\t" + "\t" + FinalGrade[x];
            uiMarksDisplayTextBox.Text += System.Environment.NewLine;
        }
    }
}              

Примером может быть:

Name    Test    Basket  Destructive   Final Grade
Dave    35      40      50            40
Danny   20      20      20            20
Alex    10      10      10            10
Goerge  0       0       0             0
Hannan  0       0       0             0
Ian     0       0       0             0
Muna    0       0       0             0

Ответы [ 3 ]

2 голосов
/ 12 апреля 2019

Вы можете использовать это для сортировки ваших данных:

var input = new IComparable[][]
{
    new IComparable[] {"Alex",  10,      10,      10,            10},
    new IComparable[] {"Danny", 20,      20,      20,            20},
    new IComparable[] {"Dave",  35,      40,      50,            40},
    new IComparable[] {"Goerge",0 ,      0 ,      0 ,            0 },
    new IComparable[] {"Hannan",0 ,      0 ,      0 ,            0 },
    new IComparable[] {"Ian",   0 ,      0 ,      0 ,            0 },
    new IComparable[] {"Muna",  0 ,      0 ,      0 ,            0 },
};

var indexOfColumnToOrderBy = 4; // "Final Grade" field
for (var i = 0; i < input.Length - 1; ++i)
{
    for (var j = i + 1; j < input.Length; ++j)
    {
        IComparable[] t;
        if (input[i][indexOfColumnToOrderBy].CompareTo(input[j][indexOfColumnToOrderBy]) < 0)
        {
            t = input[i];
            input[i] = input[j];
            input[j] = t;
        }
    }
}

Я объявил каждый элемент ваших вложенных массивов как IComparable, потому что и string, и int реализуют этот интерфейс, и поэтому вы можете использовать методCompareTo

И вот как мы делаем это в 21-м веке: создаем класс Student:

private class Student
{
    public string Name { get; set; }
    public int Test { get; set; }
    public int Basket { get; set; }
    public int Destructive { get; set; }
    public int FinalGrade { get; set; }
}

, определяем ваш ввод как

var input = new Student[]
{
    new Student {Name = "Alex",    Test = 10,  Basket = 10, Destructive = 10,   FinalGrade = 10},
    new Student {Name = "Danny",   Test = 20,  Basket = 20, Destructive = 20,   FinalGrade = 20, },
    new Student {Name = "Dave",    Test = 35,  Basket = 40, Destructive = 50,   FinalGrade = 40, },
    new Student {Name = "Goerge",  Test = 0,   Basket = 0,  Destructive = 0,    FinalGrade = 0,  },
    new Student {Name = "Hannan",  Test = 0,   Basket = 0,  Destructive = 0,    FinalGrade = 0,  },
    new Student {Name = "Ian",     Test = 0,   Basket = 0,  Destructive = 0,    FinalGrade = 0,  },
    new Student {Name = "Muna",    Test = 0,   Basket = 0,  Destructive = 0,    FinalGrade = 0,  },
};

и сортируем с помощью Linq:

var sorted = input.OrderByDescending(student => student.FinalGrade).ToArray();

Даже если этот подход не удовлетворяет требованиям профессора, вы можете использовать его для отладки собственного алгоритма

0 голосов
/ 12 апреля 2019

Я не думаю, что вы можете пройти через это только один раз.Вы можете попробовать некоторую рекурсивную логику, подобную приведенной ниже, чтобы продолжать цикл до тех пор, пока все не будет отсортировано.

private List<YourObject> Sort(FinalGrade){
   bool finished = true; 
        for (int x = 0; x < FinalGrade.Length; x++)
            {
                for (int j = x + 1; j < FinalGrade.Length; j++)
                {
                    if (FinalGrade[x] > FinalGrade[j])
                    {
                        temp = FinalGrade[j];
                        FinalGrade[j] = FinalGrade[x];
                        FinalGrade[x] = temp;
                        finished = false;
                    }                      
                }
            }

   return finished? FinalGrade : Sort(FinalGrade)
}
0 голосов
/ 12 апреля 2019

Для решения проблемы, как есть, вот алгоритм высокого уровня:

Сначала убедитесь, что все массивы имеют одинаковую длину.

Затем примените свой любимый алгоритм сортировки (я рекомендую пузырьковую сортировку для начинающих. Худший алгоритм сортировки, но его легче всего изучить).

Каждый раз, когда вы меняете элемент в массиве FinalGrade, вы меняете элементы в других массивах с тем же индексом.

например, если вы поменялись местами Index 1 и 3 в FinalGrade, вы также поменяете местами элементы 1 и 3 для всех других массивов.

Я оставлю фактическое кодирование как упражнение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...