joyjhonson Ответов: 1

Как сортировать carray класса


// Consider below class

class CAnimalData 
{
public:
	CAnimalData(int id, CString text)
	{
		m_id = id;
		m_text = text;
	}
	
	int		m_id;
	CString	m_text;


};

//lets create an array of class

typedef CArray <CAnimalData, CAnimalData&> RADARDATACONTAINER;

//create object of array
RADARDATACONTAINER  objContainer


//Now lets say we create 4 objects of class CAnimalData and keep storing all objects in CArray

CAnimalData data1 ( 0, "Simple")
objContainer.SetAtGrow(data1.m_id, dataBool);

CAnimalData data2 ( 1, "Cat")
objContainer.SetAtGrow(data2.m_id, dataBool);

CAnimalData data3 2, "Aargalis")
objContainer.SetAtGrow(data3.m_id, dataBool);

CAnimalData data4 ( 3, "Dog")
objContainer.SetAtGrow(data4.m_id, dataBool);

store all objects in RADARDATACONTAINER.

The class had two variables, please consider below values.

m_id   m_text
0	   Simple
1      Cat
2     Aargalis
3     Dog


Now I want to sort the CArray by m_text ( not by m_id), so below code should give me result in alphabetical order , how can I sort CArray?

CAnimalData dataStore;
iUBound = objContainer.GetUpperBound();

for(int i = 0; i <= iUBound; i++)

{
		dataStore = objContainer.GetAt(i);
	    Cout<< dataStore.m_id << "   "   << dataStore.m_text;
		
		
	    
}

I see below output:

0	   Simple
1      Cat
2     Aargalis
3     Dog


But I need below output: ( sorting based on text)

2     Aargalis
1     Cat
3     Dog
0	  Simple

Can anybody help me on this?


Что я уже пробовал:

пробовал, но не получилось, не уверен, что есть готовая функция, доступная в классе CArray.
Будет здорово, если кто-нибудь сможет мне здесь помочь

joyjhonson

Обратите внимание , что после заполнения значений в объекте Carray я хочу отсортировать их на основе m_text.

1 Ответов

Рейтинг:
0

Rick York

Вы не можете использовать RTL-функции, такие как qsort, поэтому вам придется написать свои собственные. Для очень небольшого набора данных пузырьковая сортировка будет работать адекватно. Вам также придется написать свою собственную процедуру подкачки, и они обычно довольно просты. Как правило, пузырьковый сорт-это что-то вроде этого :

int count = collection.size();
for( int m = 0; m < count-1; ++m )
{
   for( int n = m + 1; n < count; ++n )
   {
       if( collection[m] > collection[n] )
       {
           collection.swap( m, n );
       }
   }
}
Вот пример подкачки :
temp = a;
a = b;
b = temp;
В этом случае a и b были двумя пунктами, проверяемыми в пузырьковой сортировке.

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

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

Один совет: вы можете изменить порядок сортировки, изменив сравнение с больше чем на меньше чем. Вы должны попробовать и то, и другое, чтобы проверить свою реализацию, если у вас есть время. Желаю удачи.


joyjhonson

спасибо за вклад. Полезно, хотя я не мог видеть swap-метод класса CArray.

Rick York

Я не знаю, есть ли он, но это то, что вы должны написать сами. Обычно он включает в себя конструктор копирования и операторы присваивания, о которых полезно знать в C++.