R类数组的排序和查找

 

元素排序

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();
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值