numberlistmodel.cpp 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  1. #include "numberlistmodel.h"
  2. NumberListModel::NumberListModel(QObject *parent) :
  3. QAbstractListModel(parent)
  4. {
  5. this->displayCount = 0;
  6. this->totalCount = 0;
  7. }
  8. int NumberListModel::rowCount(const QModelIndex & /* parent */) const
  9. {
  10. return displayCount;
  11. }
  12. void NumberListModel::clear()
  13. {
  14. this->displayCount = 0;
  15. this->totalCount = 0;
  16. this->segments.clear();
  17. this->numbers.clear();
  18. this->orderIndex.clear();
  19. this->indexMap.clear();
  20. this->rowsIndex.clear();
  21. this->colsIndex.clear();
  22. beginResetModel();
  23. endResetModel();
  24. }
  25. //void NumberListModel::optimize()
  26. //{
  27. // int length=segments.size();
  28. // for(int i=0;i<length;i++)
  29. // {
  30. // emit optimizeProgressMaxUpdated(length);
  31. // emit optimizeProgressCurrentUpdated(i+1);
  32. // for (int j=i+1;j<length;j++)
  33. // {
  34. // if (segments.at(j) == segments.at(i) )
  35. // {
  36. // numbers[i].append(numbers[j]);
  37. // numbers.removeAt(j);
  38. // segments.removeAt(j);
  39. // j--;
  40. // }
  41. // length = segments.size();
  42. // }
  43. // }
  44. // setMapIndex();
  45. //}
  46. void NumberListModel::mergeSegment()
  47. {
  48. int length=segments.size();
  49. heapSort(length);
  50. for(int i=0;i<length;i++)
  51. {
  52. emit optimizeProgressMaxUpdated(length);
  53. emit optimizeProgressCurrentUpdated(i+1);
  54. int j = i+1;
  55. if(j < length)
  56. {
  57. if (segments.at(j) == segments.at(i) )
  58. {
  59. numbers[i].append(numbers[j]);
  60. numbers.removeAt(j);
  61. segments.removeAt(j);
  62. i--;
  63. length = segments.size();
  64. }
  65. }
  66. }
  67. //setMapIndex();
  68. }
  69. void NumberListModel::setNumberList(QStringList segments,QList<QStringList> numbers)
  70. {
  71. this->displayCount = 0;
  72. this->totalCount = 0;
  73. this->segments.clear();
  74. this->numbers.clear();
  75. this->orderIndex.clear();
  76. this->segments = segments;
  77. this->numbers = numbers;
  78. for(int i=0;i<this->numbers.size();i++)
  79. {
  80. totalCount = totalCount + this->numbers.at(i).size();
  81. }
  82. for(int i=0;i<totalCount;i++)
  83. {
  84. orderIndex.append(i);
  85. }
  86. //setMapIndex();
  87. beginResetModel();
  88. endResetModel();
  89. if (canFetchMore(QModelIndex()))
  90. fetchMore(QModelIndex());
  91. }
  92. QList<int> NumberListModel::getOrderIndex()
  93. {
  94. return orderIndex ;
  95. }
  96. void NumberListModel::setOrderIndex(QList<int> orderIndex)
  97. {
  98. this->orderIndex = orderIndex;
  99. this->displayCount = 0;
  100. beginResetModel();
  101. endResetModel();
  102. if (canFetchMore(QModelIndex()))
  103. fetchMore(QModelIndex());
  104. }
  105. void NumberListModel::quickSortSegment()
  106. {
  107. heapSort(segments.size());
  108. //setMapIndex();
  109. }
  110. int NumberListModel::getCount()
  111. {
  112. return totalCount ;
  113. }
  114. QStringList NumberListModel::getSegments()
  115. {
  116. return segments ;
  117. }
  118. QList<QStringList> NumberListModel::getNumbers()
  119. {
  120. return numbers ;
  121. }
  122. QVariant NumberListModel::data(const QModelIndex &index, int role) const
  123. {
  124. if (!index.isValid())
  125. return QVariant();
  126. if (index.row() >= totalCount || index.row() < 0)
  127. return QVariant();
  128. switch(role)
  129. {
  130. case Qt::DisplayRole://return alias instead of url
  131. return QVariant(getNumber(index.row()));
  132. break;
  133. case Qt::EditRole:
  134. return QVariant(getNumber(index.row()));
  135. break;
  136. }
  137. return QVariant();
  138. }
  139. bool NumberListModel::canFetchMore(const QModelIndex & /* index */) const
  140. {
  141. if (displayCount < totalCount)
  142. return true;
  143. else
  144. return false;
  145. }
  146. void NumberListModel::fetchMore(const QModelIndex & /* index */)
  147. {
  148. if(totalCount==0)
  149. return ;
  150. int remainder = totalCount - displayCount;
  151. int itemsToFetch = qMin(100, remainder);
  152. beginInsertRows(QModelIndex(), displayCount, displayCount+itemsToFetch-1);
  153. displayCount += itemsToFetch;
  154. endInsertRows();
  155. //emit numberPopulated(itemsToFetch);
  156. }
  157. void NumberListModel::setMapIndex()
  158. {
  159. rowsIndex.clear();
  160. colsIndex.clear();
  161. int currow = 0;
  162. int curcol = 0;
  163. int row = 0;
  164. int col = 0;
  165. if(this->numbers.size()==0)
  166. return ;
  167. int numCount = this->numbers.at(0).size();
  168. for(int i=0;i<this->getCount();i++)
  169. {
  170. if( i > numCount -1)//must skip next row;
  171. {
  172. currow++;
  173. curcol = 0;
  174. numCount += this->numbers.at(currow).size();
  175. }
  176. row = currow;
  177. col = curcol++;
  178. rowsIndex << row;
  179. colsIndex << col;
  180. }
  181. }
  182. QString NumberListModel::getNumberEx(int index) const
  183. {
  184. int realrow = orderIndex.at(index);
  185. if(realrow<colsIndex.size()&&realrow<rowsIndex.size())
  186. {
  187. int row = rowsIndex.at(realrow);
  188. int col = colsIndex.at(realrow);
  189. return this->segments.at(row)+this->numbers.at(row).at(col);
  190. }
  191. else
  192. return "";
  193. }
  194. QString NumberListModel::getNumber(int shadowRow) const
  195. {
  196. int totalRow;
  197. int lastTotalRow;
  198. int curRow;
  199. lastTotalRow = 0;
  200. curRow =0;
  201. int row = orderIndex.at(shadowRow);
  202. QTime t;
  203. t.start();
  204. for(int i=0;i<this->numbers.size();i++)
  205. {
  206. totalRow = lastTotalRow + numbers.at(i).size();
  207. if(row>totalRow-1)
  208. {
  209. lastTotalRow = totalRow;
  210. continue;
  211. }
  212. else
  213. {
  214. curRow = row-lastTotalRow;
  215. int tt = t.elapsed();
  216. if(tt>0)
  217. ;//qDebug()<<tt<<i;
  218. return segments.at(i)+numbers.at(i).at(curRow);
  219. }
  220. lastTotalRow = totalRow;
  221. }
  222. }
  223. void NumberListModel::heapAdjust(int i,int nLength)
  224. {
  225. int nChild=0;
  226. QString temp;
  227. QStringList tmplist;
  228. for (temp = segments[i]; 2 * i + 1 < nLength; i = nChild)
  229. {
  230. temp = segments[i];
  231. tmplist = numbers[i];
  232. nChild = 2 * i + 1;//左边的叶子节点
  233. //得到较大的叶子节点
  234. if (nChild < nLength - 1)
  235. {
  236. if( segments[nChild + 1] > segments[nChild])
  237. {
  238. ++nChild;
  239. }
  240. }
  241. //如果较大的叶子节点比父节点大,则交换两个节点的数据
  242. //同时继续向下寻找交换后的数据是否又比子节点小i = nChild
  243. if (temp < segments[nChild])
  244. {
  245. segments[i]= segments[nChild];
  246. numbers[i] = numbers[nChild];
  247. segments[nChild] = temp;
  248. numbers[nChild] = tmplist;
  249. }//建立大根堆成功,中止返回
  250. else
  251. {
  252. break;
  253. }
  254. }
  255. //qDebug()<<i;
  256. return ;
  257. }
  258. void NumberListModel::heapSort(int length)
  259. {
  260. // 调整序列的前半部分元素,调整完之后第一个元素是序列的最大的元素
  261. for (int i = length / 2 - 1; i >= 0; --i)
  262. {
  263. heapAdjust(i,length);
  264. }
  265. // 从最后一个元素开始对序列进行调整,不断的缩小调整的范围直到第一个元素
  266. for (int i = length - 1; i > 0; --i)
  267. {
  268. // 把第一个元素和当前的最后一个元素交换,
  269. // 保证当前的最后一个位置的元素都是在现在的这个序列之中最大的
  270. swap(0,i);
  271. // 不断缩小调整heap的范围,每一次调整完毕保证第一个元素是当前序列的最大值
  272. heapAdjust(0,i);
  273. }
  274. return ;
  275. }
  276. void NumberListModel::swap(int i,int j)
  277. {
  278. QString tmp = segments[i];
  279. QStringList tmplist = numbers[i];
  280. segments[i] = segments[j];
  281. numbers[i]= numbers[j];
  282. segments[j] = tmp;
  283. numbers[j] = tmplist;
  284. return ;
  285. }