C ++, Net, WindowsForms Сортировка списка по значениям другого списка - PullRequest
1 голос
/ 05 октября 2011

У меня есть два списка. Один имеет тип MyClass и заполнен этими классами, написанными мной. А у второго есть некоторые значения int.

И проблема в том, что я не знаю, как справиться с сортировкой первого списка по значениям второго. Я понятия не имею, как написать IComparer для использования метода списка сортировки. Я видел пример в MSDN, но я не знаю, как его изменить. http://msdn.microsoft.com/en-us/library/234b841s.aspx#Y535

Вот моя программа:

// ##################################

ref class MyClass{
private:
  int x;
  int y;
  String^ name;
public:
  MyClass(int x, int y, String^ name){
  this->x = x;
  this->y = y;
  this->name = name;
}
...
};

//###### in some button which will initialize...:

List<MyClass^>^ listMyClass = gcnew List<MyClass^>(3);
listMyClass->Add(gcnew MyClass(3, 5, "class1"));
listMyClass->Add(gcnew MyClass(1, 2, "class2"));
listMyClass->Add(gcnew MyClass(6, 8, "class3"));

List<int>^ numbers = gcnew List<int>(3);
numbers->Add(2);
numbers->Add(4);
numbers->Add(1);

// ###################################

Эти числа чисел List представляют своего рода состояние элементов listMyClass. Поэтому я хотел бы отсортировать listMyClass, используя значения из номеров списка. Я бы хотел получить такой результат после сортировки: listMyClass[1] является первым, потому что номер 4 из списка номеров является самым высоким. затем listMyClass[0], а затем listMyClass[2]

Есть ли какие-либо возможности для решения этой проблемы?

Ответы [ 3 ]

0 голосов
/ 06 октября 2011

(не относится к C ++ / CLI)

Используйте Dictionary<int, int> вместо второго списка:

  • Ключ - это статус.
  • Значением является порядок сортировки этого состояния.

Затем можно легко реализовать пользовательский IComparer<T>.Compare(T x, T y), который бы ...

  1. Поиск порядка сортировки x.status из Dictionary.
  2. Просмотр порядка сортировки y.status из Dictionary.
  3. Сравните эти порядки сортировки напрямую.

... затем передайте этот компаратор в List<T>.Sort(IComparer<T>) для первого списка.

PS Для нативного решения C ++ вы можете использовать аналогичную идею с std::unordered_map<int, int>.

0 голосов
/ 06 октября 2011

Мне удалось победить этот вызов :) Вот решение

ref class MyClass:IComparable<MyClass^>{
public:
  int x;
  int y;
  int status;
  String^ name;

  MyClass(int x, int y, String^ name){
  this->x = x;
  this->y = y;
  this->name = name;
  }

  virtual int CompareTo(MyClass^ tmpMyClass){
      if(this->status > tmpMyClass->status)
         return 1;
      if(this->status < tmpMyClass->status)
         return -1;
      else
         return 0;
  }
...
};

//###### in some button which will initialize...:

List<MyClass^>^ listMyClass = gcnew List<MyClass^>(3);
listMyClass->Add(gcnew MyClass(3, 5, "class1"));
listMyClass->Add(gcnew MyClass(1, 2, "class2"));
listMyClass->Add(gcnew MyClass(6, 8, "class3"));

List<int>^ numbers = gcnew List<int>(3);
numbers->Add(2);
numbers->Add(4);
numbers->Add(1);

for(int i=0; i<listMyClass->Count; i++){
   listMyClass->status = numbers[i];
}
listMyClass->Sort();

Я почувствовал такое облегчение :) Спасибо за любые советы.

0 голосов
/ 05 октября 2011

Если уникальны int values во втором списке, вы можете использовать std::vector для вставки MyClass в положение, указанное значениями int, которые вы сохранили во втором списке. Если нет, используйте std::multiset с int values в качестве ключа.

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