我正在使用applicationWillResignActive()
对降序排列的结构数组中的双精度值进行排序。我有以下代码:
Date currentDate = Calendar.getInstance(TimeZone.getDefault()).getTime()
我尝试使用qsort()对整数进行排序,并且它已经奏效。但是,当尝试对double进行排序时,我的输出未排序:
排序后:
页面ID = 2,值= 0.223000
页面ID = 3,值= 0.167300
页面ID = 4,val = 0.144200
页面ID = 5,值= 0.249900
页面ID = 1,值= 0.060800
我不确定为什么输出没有正确排序。我已经在线阅读了有关对结构数组中的值进行排序的文章,并且我相信我的比较功能是正确的。任何见解将不胜感激。
答案 0 :(得分:2)
这是因为compare函数返回一个整数。 -(pageA->val - pageB->val)
的结果将四舍五入。
切换到
if (pageA->val == pageB->val)
return 0;
else if(pageA->val > pageB->val)
return 1;
else
return -1;
我相信我的比较功能是正确的。
此处提示。如果您仅认为某个功能正确,请对其进行测试以确保功能正确。您通过打印结果验证了排序不起作用。您也可以打印比较功能的输出。
答案 1 :(得分:2)
因此我们可以看到该数组正在排序(这些ID已移动)。而且ID和值仍然正确匹配,因此qsort
可以正确移动数据(我们没有sizeof
错误)。
所以我们的问题必须是我们传递的比较函数。让我们看一下:
int cmpfunc(const void *a, const void *b) {
const page *pageA = (page*)a;
const page *pageB = (page*)b;
return -(pageA->val - pageB->val);
}
返回一个整数,我们正在比较双精度数。 pageA->val - pageB->val
的结果是一个double,然后将其舍入为int
。这意味着当它们不相等时,有时会舍入为零(意味着相等)。
更好的是:
int cmpfunc(const void *a, const void *b) {
const page *pageA = (page*)a;
const page *pageB = (page*)b;
if (pageA->val == pageB->val)
return 0;
else
return (pageA->val > pageB->val ? 1 : -1);
}