Как отсортировать двухмерные массивы по строкам? - PullRequest
1 голос
/ 24 сентября 2019

Я хочу отсортировать этот двумерный массив названий химических веществ с соответствующими номерами в порядке убывания.Первая половина алгоритма работает, помещая Азот вверху, а Серу - на второй.Последние два, то есть Водород и Аммиак, однако, не обмениваются рядами друг с другом.

String[,] chem = new String[4, 2];
        chem[0, 0] = "Hydrogen";
        chem[0, 1] = "221";
        chem[1, 0] = "Sulphur";
        chem[1, 1] = "431";
        chem[2, 0] = "Ammonia";
        chem[2, 1] = "332";
        chem[3, 0] = "Nitrogen";
        chem[3, 1] = "688";
        string temp, temp2;
        int key = 0;
        for (int i = 1; i < 4; i++)
        {
            for (int j = 0; j < 2; j++)
            {
                key = 0;
                for (int p = i - 1 ; p >= 0 && key != 1;)
                {
                    if (int.Parse(chem[i, 1]) > int.Parse(chem[j, 1]))
                        {
                        temp = chem[i, 1];
                        chem[i, 1] = chem[j, 1];
                        chem[j, 1] = temp;
                        temp2 = chem[i, 0];
                        chem[i, 0] = chem[j, 0];
                        chem[j, 0] = temp2;
                    }
                    else { key = 1; }
                }
            }
        }

Ответы [ 4 ]

1 голос
/ 24 сентября 2019

Пара моментов:

  • Ваша переменная p нигде не ссылается и не обновляется, поэтому самый внутренний цикл for эффективно выполняет while(key != 1)
  • ВашЦикл от j = 0 до j < 2 for изначально выглядит разумным (i и j обычно используются для разных индексов, а ваш массив new String[4, 2];) - но вы фактически используете их для одного и того же индекса.Возможно, вы хотите запустить j с j = 0 до j < 4 вместо j = 0 до j < 2

Не удалось проверить это - извинения

0 голосов
/ 24 сентября 2019

Здесь есть альтернативное решение. Надеюсь, оно может быть полезным. Вам поможет словарь вместо массива.

        var chems = new Dictionary<int, string>();
        chems.Add(221, "Hydrogen");
        chems.Add(431,"Sulphur");
        chems.Add(332, "Ammonia");
        chems.Add(688, "Nitrogen");

        var order = chems.Keys.ToList();
        order.Sort();

        foreach (var chem in order)
        {

            Console.WriteLine("{0}:{1}",chem,chems[chem]);
        }
        Console.ReadLine();
0 голосов
/ 24 сентября 2019

Вот еще один способ, более читабельный, хотя и более ресурсоемкий

var dict = new Dictionary<string, string>();

for (int i = 0; i < chem.GetLength(0); i++)
{
    dict.Add(chem[i, 0], chem[i, 1]);
}

var reverse_dict = dict.Reverse().ToList();

for (int i = 0; i < chem.GetLength(0); i++)
{
    chem[i, 0] = reverse_dict[i].Key;
    chem[i, 1] = reverse_dict[i].Value;
}
0 голосов
/ 24 сентября 2019

Я сомневаюсь, если вы хотите 2D массив , как это (вы ищете Dictionary<string, int>?);если вы настаиваете на этом, мы можем превратить массив в более удобную коллекцию:

 List<Tuple<string, int>> data = new List<Tuple<string, int>>();

 for(int i = 0; i < chem.GetLength(0); ++i)
   data.Add(Tuple.Create(chem[i, 0], int.Parse(chem[i, 1]))); 

Затем отсортировать data с помощью OrderBy / OrderByDescending и вернуть значения в chem

 using System.Linq;

 ... 

 int index = 0;

 foreach (var tuple in data.OrderByDescending(item => item.Item2)) {
   chem[index, 0] = tuple.Item1; 
   chem[index, 1] = tuple.Item2.ToString();

   index += 1; 
 }

Наконец, давайте извлечем метод:

private static void SortChem(string[,] chem) {
  List<Tuple<string, int>> data = new List<Tuple<string, int>>();

  for(int i = 0; i < chem.GetLength(0); ++i)
    data.Add(Tuple.Create(chem[i, 0], int.Parse(chem[i, 1]))); 

  int index = 0;

  foreach (var tuple in data.OrderByDescending(item => item.Item2)) {
    chem[index, 0] = tuple.Item1; 
    chem[index, 1] = tuple.Item2.ToString();

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