#c# #arrays #sorting #multidimensional-array
Вопрос:
Итак, у меня есть таблица данных в 2D-массиве (первый столбец-порядковый номер строк, а остальные-данные, с которыми я работаю). Мой вопрос в основном заключается в том, как я могу сортировать строки на основе наибольшего значения в последнем столбце (т. Е. Если четвертая строка получила наибольшее значение в последнем столбце, она переходит в первую строку и так далее). random
в коде есть только метод, который я создал для генерации чисел с плавающей запятой между x и y.
Мой код до сих пор выглядит так:
static float random(float min, float max)
{
System.Random random = new System.Random();
double val = (random.NextDouble() * (max - min) min);
return (float)val;
}
static void Main(string[] args)
{
int temp = 0, i, j;
float[,] matrix;
matrix = new float[10, 5];
//generating ordinal number
for (i = 0; i < 10; i )
{
matrix[i, 0] = temp;
}
//generating rest of the 2D array
for (i = 0; i < 10; i )
{
for (j = 0; j < 5; j )
{
matrix[i, 1] = random(60, 100);
matrix[i, 2] = random(50, 100);
matrix[i, 3] = random(40, 100);
matrix[i, 4] = (matrix[i, 1] matrix[i, 2] matrix[i, 3]) / 3;
}
}
for (i = 0; i < 10; i )
{
for (j = 0; j < 5; j )
{
Console.Write(matrix[i, j] "t");
}
Console.WriteLine();
}
Console.WriteLine();
}
Ответ №1:
Я предлагаю использовать неровный массив (массив массива) float[][]
вместо 2d float[,]
. С помощью неровного массива вы можете сортировать в одной простой строке:
using System.Linq;
...
float[][] matrix = ...
// Column to compare
int column = 4; // or matrix[0].Length - 1; for the last olumn
Array.Sort(matrix, (left, right) => left[column].CompareTo(right[column])));
Если вы настаиваете на том float[,]
, чтобы вы могли скопировать его в неровный массив, отсортировать, а затем скопировать обратно:
float[,] matrix = ...
int column = 4;
float[][] temp = Enumerable
.Range(0, matrix.GetLength(0))
.Select(i => Enumerable
.Range(0, matrix.GetLength(1))
.Select(j => matrix[i, j])
.ToArray())
.ToArray();
Array.Sort(temp, (left, right) => left[column].CompareTo(right[column]));
for (int i = 0; i < temp.Length; i)
for (int j = 0; j < temp[i].Length; j)
matrix[i, j] = temp[i][j];