我用SQL语句对字符字段排序:
SELECT Class,Layer FROM NoteTemplate ORDER BY Class
把排序后的结果存到CStringArray数组里,然后用二分法查找:
int GetIndex(CString strKey, CStringArray &strArray)
{
int nMid, nLow = 0, nHigh = strArray.GetUpperBound();
while (nLow <= nHigh)
{
nMid = (nHigh + nLow) / 2;
if (strArray[nMid] == strKey)
return nMid;
if (strArray[nMid] < strKey)
nLow = nMid + 1;
else
nHigh = nMid - 1;
}
return -1;
}
发现有的字符串通过GetIndex查找不到,但通过直接循环查找证实数组中确实有那个字符串,
这是什么原因呢?个人猜想:SQL排序用的是Unicode码,而我的二分查找用的是ASCII码。
但不知如何验证,已经如何通过修改SQL语句解决这个问题?
SELECT Class,Layer FROM NoteTemplate ORDER BY Class
把排序后的结果存到CStringArray数组里,然后用二分法查找:
int GetIndex(CString strKey, CStringArray &strArray)
{
int nMid, nLow = 0, nHigh = strArray.GetUpperBound();
while (nLow <= nHigh)
{
nMid = (nHigh + nLow) / 2;
if (strArray[nMid] == strKey)
return nMid;
if (strArray[nMid] < strKey)
nLow = nMid + 1;
else
nHigh = nMid - 1;
}
return -1;
}
发现有的字符串通过GetIndex查找不到,但通过直接循环查找证实数组中确实有那个字符串,
这是什么原因呢?个人猜想:SQL排序用的是Unicode码,而我的二分查找用的是ASCII码。
但不知如何验证,已经如何通过修改SQL语句解决这个问题?
for(int i=1; i<strArray.GetCount(); i++)
{
if(strArray[i] < strArray[i-1])
AfxMessageBox(_T("error"));
}如果确定是SQL排序问题,只好自己排序了,可以用qsortint comporeStringPorc(const void* p1, const void* p2)
{
const CString* pStr1 = (const CString*)p1;
const CString* pStr2 = (const CString*)p2; if(*pStr1 == *pStr2)
return 0; return (*pStr1 < *pStr2? -1:1);
}qsort(strArray.GetData(), strArray.GetSize(), sizeof(CString), comporeStringPorc);
for (i=1; i<arFontClass.GetSize(); i++)
{
ASSERT(arFontClass[i-1] < arFontClass[i]);
}确实有个问题,排成这样的结果:
"@" < "0"
为什么会这样呢?