boxdatareader.cpp
68 lines
| 2.0 KiB
| text/x-c
|
CppLexer
Mika Salmela
|
r2508 | /**************************************************************************** | ||
** | ||||
** Copyright (C) 2012 Digia Plc | ||||
** All rights reserved. | ||||
** For any questions to Digia, please use contact form at http://qt.digia.com | ||||
** | ||||
** This file is part of the Qt Commercial Charts Add-on. | ||||
** | ||||
** $QT_BEGIN_LICENSE$ | ||||
** Licensees holding valid Qt Commercial licenses may use this file in | ||||
** accordance with the Qt Commercial License Agreement provided with the | ||||
** Software or, alternatively, in accordance with the terms contained in | ||||
** a written agreement between you and Digia. | ||||
** | ||||
** If you have questions regarding the use of this file, please use | ||||
** contact form at http://qt.digia.com | ||||
** $QT_END_LICENSE$ | ||||
** | ||||
****************************************************************************/ | ||||
#include "boxdatareader.h" | ||||
Mika Salmela
|
r2512 | BoxDataReader::BoxDataReader(QIODevice *device) : | ||
QTextStream(device) | ||||
Mika Salmela
|
r2508 | { | ||
} | ||||
QBoxSet* BoxDataReader::readBox() | ||||
{ | ||||
QString line = readLine(); | ||||
if (line.startsWith("#")) | ||||
return 0; | ||||
QStringList strList = line.split(" ", QString::SkipEmptyParts); | ||||
Mika Salmela
|
r2512 | sortedList.clear(); | ||
Mika Salmela
|
r2513 | |||
for (int i = 1; i < strList.count(); i++) { | ||||
sortedList.append(strList.at(i).toDouble()); | ||||
Mika Salmela
|
r2508 | } | ||
qSort(sortedList.begin(), sortedList.end()); | ||||
int count = sortedList.count(); | ||||
Mika Salmela
|
r2513 | QBoxSet *box = new QBoxSet(strList.first()); | ||
Mika Salmela
|
r2512 | box->setLowerExtreme(sortedList.first()); | ||
Mika Salmela
|
r2508 | box->setUpperExtreme(sortedList.last()); | ||
Mika Salmela
|
r2512 | box->setMedian(findMedian(0, count)); | ||
box->setLowerQuartile(findMedian(0, count / 2)); | ||||
if (count % 2) | ||||
box->setUpperQuartile(findMedian(count / 2 + 1, count)); | ||||
else // even amount of numbers | ||||
box->setUpperQuartile(findMedian(count / 2, count)); | ||||
Mika Salmela
|
r2508 | return box; | ||
} | ||||
Mika Salmela
|
r2512 | qreal BoxDataReader::findMedian(int begin, int end) | ||
{ | ||||
int count = end - begin; | ||||
if (count % 2 ) { | ||||
return sortedList.at((int) (count/2) + begin); | ||||
} else { | ||||
qreal right = sortedList.at(count / 2 + begin); | ||||
qreal left = sortedList.at(count / 2 - 1 + begin); | ||||
return (right + left) / 2.0; | ||||
} | ||||
} | ||||