Сортировка двухмерного массива. - страница 2

 

С той же пузырьковой сортировкой можно, только не нужно соединять два измерения в одно. Проверку делать по одному измерению, а менять местами в обеих измерениях.

Есть и еще способ. Для строкового измерения сделать строковый массив, а двухмерный массив с делать типа инт, в первом измерении числа по которым выполняется сортировка, а во втором индексы массива со строками.  В этом случае можно использовать ArraySort().

 
Integer:

Есть и еще способ. Для строкового измерения сделать строковый массив, а двухмерный массив с делать типа инт, в первом измерении числа по которым выполняется сортировка, а во втором индексы массива со строками.  В этом случае можно использовать ArraySort().

К сожалению прокатит только в МТ4, т.к. ArraySort() в МТ5 работает только с одномерными массивами.

 
Andrey Miguzov:

К сожалению прокатит только в МТ4, т.к. ArraySort() в МТ5 работает только с одномерными массивами.

ArraySort в МТ5 работает с многомерными массивами. Отсутствует только MODE_DESCEND.
 
Stanislav Korotky:
ArraySort в МТ5 работает с многомерными массивами. Отсутствует только MODE_DESCEND.

Да всё верно: 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Список изменений в билдах MetaTrader 5 Client Terminal

MetaQuotes Software Corp., 2015.05.20 17:16

В пятницу 22 мая 2015 года будет опубликовано обновление платформы MetaTrader 5. Обновление содержит следующие изменения:

MetaTrader 5 Client Terminal build 1150 

19. MQL5: Функции сортировки и поиска в массиве ArraySort, ArrayBsearch, ArrayMinimum и ArrayMaximum теперь работают и с многомерными массивами. Сортировка и поиск происходят только по первому (нулевому) индексу массива. Ранее эти функции работали только с одномерными массивами.

 А когда обсуждали - ещё не умела :)

 
Vasiliy Sokolov:

Я бы решил так: каждая строка представляет собой некий объект CObject, а вся таблица: CArrayObj. В своем классе наследнике CObject перегрузите метод Compare. Вот накидал полностью рабочую демонстрацию в виде скрипта:

 Смотрим вывод:

Всем привет! НЕ могу сообразить как дописать представленный тут класс для сортировки таблицы более 2 столбцов. 1 столбец string, последующие столбцы данные типа double
 
Sergey Gritsay:
Всем привет! НЕ могу сообразить как дописать представленный тут класс для сортировки таблицы более 2 столбцов. 1 столбец string, последующие столбцы данные типа double
Нужно в CLineTable добавить дополнительные поля double, а также расширить типы сортировки в методе Compare.
 
Vasiliy Sokolov:
Нужно в CLineTable добавить дополнительные поля double, а также расширить типы сортировки в методе Compare.

я уже сообразил, все заработало, вот так написал

#define EQUAL 0
#define LESS -1
#define MORE 1
#include <Object.mqh>
#include <Arrays\ArrayObj.mqh>
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
enum ENUM_SORT_TYPE
  {
   SORT_BY_TEXT,
   SORT_BY_NUMBER
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class CLineTable: public CObject
  {
private:
   string            m_text;
   double            m_number;
   double            m_number2;
   double            m_number3;
public:
                     CLineTable();
                     CLineTable(string text,double number,double number2,double number3)
     {
      m_text=text;
      m_number=number;
      m_number2=number2;
      m_number3=number3;
     }
   string Text()const{return m_text;}
   double Number()const{return m_number;}
   double Number2()const{return m_number2;}
   double Number3()const{return m_number3;}
   virtual int Compare(const CObject *node,const int mode=0) const
     {
      const CLineTable *line=node;
      switch(mode)
        {
         case SORT_BY_TEXT:
            if(line.Text()==this.Text())
            return EQUAL;
            else if(line.Text()<this.Text())
               return MORE;
            else
               return LESS;
         case SORT_BY_NUMBER:
            if(line.Number()==this.Number())
            return EQUAL;
            else if(line.Number()<this.Number())
               return MORE;
            else
               return LESS;

            if(line.Number2()==this.Number2())
               return EQUAL;
            else if(line.Number2()<this.Number2())
               return MORE;
            else
               return LESS;

            if(line.Number3()==this.Number3())
               return EQUAL;
            else if(line.Number3()<this.Number3())
               return MORE;
            else
               return LESS;
        }
      return EQUAL;
     }
  };
 
Sergey Gritsay:

я уже сообразил, все заработало, вот так написал

Да, именно так и имел ввиду. Но вообще предложенный способ к сожалению не универсальный. При изменении размерности таблицы или типов ее колонок, приходится перекраивать класс CLineTable. Думаю есть способ лучше. Можно создать универсальную сортировку произвольных таблиц, содержащих произвольное количество типов данных и колонок.
 
Vasiliy Sokolov:
Да, именно так и имел ввиду. Но вообще предложенный способ к сожалению не универсальный. При изменении размерности таблицы или типов ее колонок, приходится перекраивать класс CLineTable. Думаю есть способ лучше. Можно создать универсальную сортировку произвольных таблиц, содержащих произвольное количество типов данных и колонок.
для моей задачи, достаточно этой реализации, а так да не плохо было бы иметь более универсальный класс сортировки таблиц.
 

Не совсем вкурил, прошу прощения с ООП не очень дружу 

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

Table.Sort(SORT_BY_NUMBER); я так пониял отсортирует эту таблицу по номерам в 2-3-4 колонке  - последовательно от 2 к 4-ой

а как сделать что бы можно было сортировать по к примеру 3-ей колонке отдельно или по 4-ой - без учета остальных номерных

это надо отдельный  SORT_BY_NUMBER2 к примеру что ли делать по примеру этих ?

Причина обращения: