元素排序
inline void Sort(TLinearOrder< T > anOrder);
排序的一般方法为:
1、 确定以元素对象的哪个属性值进行排序。定义一个比较函数比较元素的属性值,如果对象的值相等,函数返回0 ;如果第一个值小,函数返回-1 ;如果第二个值小,函数返回+1 。可以将该比较函数实现为静态成员函数、全局函数或命名空间的成员,比较函数的两个参数类型必须为const 引用类型。
2、 用比较函数指针构造一个TLinearOrder 对象。
3、 在数组上调用Sort() ,同时传递TLinearOrder 对象。
查找元素
inline TInt Find(const T &anEntry, TIdentityRelation< T > anIdentity) const;
在数组上使用指定匹配法则顺序查找与指定对象相等的数组元素,并返回元素索引值。匹配法则提供了一个函数来确定了两个对象是否匹配。查找顺序从低位数组索引值开始,并不保证数组元素是顺序排列。
查找的一般方法为:
1、 确定以元素对象的哪个属性值进行查找。定义一个比较函数比较元素的属性值,如果对象的值相等,函数返回ETrue ;否则返回EFalse 。可以将该比较函数实现为静态成员函数、全局函数或命名空间的成员,比较函数的两个参数类型必须为const 引用类型。
2、 构造一个匹配对象,作为查找的目标。
3、 用比较函数指针构造一个TIdentityRelation 对象。
4、 在数组上调用Find () ,同时传递TLinearOrder 对象和匹配对象。
3、排序,Sort方法
在.net中,实现排序方法必须要实现一个委托,此委托将传入的两个变量进行比较,然后返回比较后的值给排序方法。
在Symbian OS中的机制类似,它使用TLinearOrder对象使用函数指针绑定一个比较函数,注意:此函数必须是静态函数、全局函数或命名空间的函数 ,在RArray的Sort方法内传入这个TLinearOrder对象。
TInt CompareTPtrC(const TPtrC& aLeft, const TPtrC& aRight)
{
return aLeft.Compare(aRight);
}
LOCAL_C void MainL()
{
_LIT(KText1, "Hello world 2 ");
_LIT(KText2, "Hello world 1 ");
RArray<TPtrC> array;
array.Append(KText1());
array.Append(KText2());
TLinearOrder<TPtrC> order(CompareTPtrC);
array.Sort(order);
console->Write(array[0]);
array.Reset();
array.Close();
}
经过排序后,返回的结果为“Hello world 1”
4、查找
查找与排序类似,都要实现一个委托来判断两个变量是否相同,此次使用TIdentityRelation类对比较函数进行封装。同样的,此比较函数必须是静态函数、全局函数或命名空间的函数。
RArray::Find方法的第一个参数为要查找的对象,第二个参数为封装了比较函数的TIdentityRelation对象。
TBool CompareTPtrC(const TPtrC& aLeft, const TPtrC& aRight)
{
return aLeft.Compare(aRight) == 0 ? ETrue : EFalse;
}
LOCAL_C void MainL()
{
_LIT(KText1, "Hello world 2 ");
_LIT(KText2, "Hello world 1 ");
RArray<TPtrC> array;
array.Append(KText1());
array.Append(KText2());
TIdentityRelation<TPtrC> relation(CompareTPtrC);
TPtrC ptr(_L("Hello world 1 "));
TInt index = array.Find(ptr, relation);
console->Write(array[index]);
array.Reset();
array.Close();
}
心得:创建一个静态成员函数,此函数返回需要查找的对象的方式,(1,0,-1),通过返回的不同可以形成升序和降序
使用函数指针,对数组进行排序
//根据需要排序的对象生成不同的返回值
TInt CToDoListContainer::CompareTodoPriorityASC(const CToDo& aLeftTodo,const CToDo& aRightTodo)
{
if (aLeftTodo.GetPriority()>aRightTodo.GetPriority())
{
return 1;
}
else if (aLeftTodo.GetPriority()<aRightTodo.GetPriority())
{
return -1;
}
else
{
return 0;
}
}
TInt CToDoListContainer::CompareTodoPriorityDESC(const CToDo& aLeftTodo,const CToDo& aRightTodo)
{
if (aLeftTodo.GetPriority()>aRightTodo.GetPriority())
{
return -1;
}
else if (aLeftTodo.GetPriority()<aRightTodo.GetPriority())
{
return 1;
}
else
{
return 0;
}
}
void CToDoListContainer::ASCSort()//升序
{
CToDoDb* dbTemp=CToDoListAppUi::GetUI()->GetTodoDb();
TLinearOrder<CToDo> order(CompareTodoPriorityASC);
dbTemp->ToDoList()->Sort(order);
dbTemp=NULL;
SetupListItemsL();
iSavedSubjectListBox->DrawNow();
}
void CToDoListContainer::DESCSort()//降序
{
CToDoDb* dbTemp=CToDoListAppUi::GetUI()->GetTodoDb();
TLinearOrder<CToDo> order(CompareTodoPriorityDESC);//创建排序的函数指针
dbTemp->ToDoList()->Sort(order);//进行排序
dbTemp=NULL;
SetupListItemsL();
iSavedSubjectListBox->DrawNow();
}