我用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语句解决这个问题?

解决方案 »

  1.   

    经证实(将二分查找函数改成Unicode版本,CStringArray改成WCHAR指针数组),好像不是Unicode问题,那是什么原因呢?
      

  2.   

    可以自己检测一下排序后的结果是不是像你说的那样存在问题:
    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);
      

  3.   

    我检测了一下:
    for (i=1; i<arFontClass.GetSize(); i++)
    {
    ASSERT(arFontClass[i-1] < arFontClass[i]);
    }确实有个问题,排成这样的结果:
    "@" < "0"
    为什么会这样呢?
      

  4.   

    数据库的排序很多不按ascii码,例如不区分大小写等。自己排吧。
      

  5.   

    只能自己排了啊,SQL语句上没法控制了?