排序問題描述:
在某一個文件夾下有很多相似的(SDxx.bin)文件 用Qt將這些文件全部掃描出來 用QTableWidget顯示出來
這些都很簡單 ^__^心虛
但是問題了 我掃描出來的文件需要排序 如果用它提供的Qt排序規則的話會出現問題
例如:我現在有20個文件
SD1.bin ~SD20.bin 默認排序的結果會是這樣的 SD1.bin SD10.bin SD11.bin . . . SD2.bin SD20.bin SD3.bin ......
SD9.bin 但是這明顯我不是我們想要的結果
所以自己需要排序讀出來的內容
最開始我使用的是快速排序
在MainWindow的頭文件中申明
static void AsscendingOrder(const QFileInfo &list1,const QFileInfo &list2);
排序 qSort(list.begin(),list.end(),&MainWindow::AscendingOrder);
int MainWindow::AscendingOrder(const QFileInfo &list1,const QFileInfo &list2)
{
// 如果兩個字符串的長度不相等那麼就把少的放前面
if(list1.fileName().length() < list2.fileName().length())
{
return 1;
}
else if(list1.fileName().length() > list2.fileName().length())
{
return -1;
}
// 兩字符串相等,就升序
else if(list1.fileName().length() == list2.fileName().length())
{
//qDebug()<< list1.fileName().toLocal8Bit().data()<<" "<<list2.fileName().toLocal8Bit().data()<<" "<<strcmp(list1.fileName().toLocal8Bit().data(),list2.fileName().toLocal8Bit().data());
return strcmp(list1.fileName().toLocal8Bit().data(),list2.fileName().toLocal8Bit().data());
}
}
但是沒成功 我的猜測可能很大部分跟我的使用方法有關
之後 我用選擇排序做的
先將 讀出的list 放到數組裏面 再由數組來進行排序就可以了
void MainWindow::AscendingOrder( QList<QFileInfo> listFileInfo )
{
int minIndex;
for(int i =0;i<listFileInfo.count()-1;i++)
{
minIndex = i;
for(int j =i+1;j<listFileInfo.count();j++)
{ //後面的比前面的長 前後位置對調
if(listFileInfo.at(j).fileName().length() < listFileInfo.at(minIndex).fileName().length())
{
minIndex = j;
}
else if(listFileInfo.at(j).fileName().length() == listFileInfo.at(minIndex).fileName().length())
{
if(strcmp(listFileInfo.at(minIndex).fileName().toLatin1(),listFileInfo.at(j).fileName().toLatin1())>0)
{
minIndex = j;
}
}
}
QFileInfo temp = listFileInfo.at(i);
listFileInfo.replace(i, listFileInfo.at(minIndex));
listFileInfo.replace(minIndex, temp);
}
}
在此我猜測 所有的QxxxList 都可以自定義排序 方法也會說將QxxxxList 轉成Qlist<Qxxxxx> 對他就可以排序了
對於QSort的排序 我再想想 有時間再補充一下