CodeKata04:Data Munging 数据解析

Data Munging

Data Munging 意思是将杂乱无章的数据进行整理

1. 练习

这里有三个基于现实数据的练习,请依次完成:

  • Part1 天气数据
    下载weather.dat(美帝一城市的天气数据,第一列 day number,第二列 最高温度,第三列最低温度),然后编写程序,输出具有最小温差的day number。
  • Part2 足球赛事表
    下载football.dat(英超联赛2001/2比赛结果)。其中“F”列和“A”列包含总进球数和被进球数。编写程序打印出进球数和失球数差最小的队名。
  • Part3 DRY 融合
    Don’t repeat yourself,尽可能抽离出以上两个程序的共同代码。

2. Kata问题

  • 当你在写原始代码时的有没有哪些设计决策,使你在抽离通用代码时更加容易或困难?
  • 第二个问题的编码是否受第一个的影响?
  • 是否抽离尽可能多的代码是更好的?代码可读性是否因此变差?可维护性怎么样?

3. Part1练习解答

使用Qt编写程序,读取数据,并打印到控制台如下图:

天气数据
可以看到,第一列为日期号码,第一列为最高温度,第二列为最低温度。解题思路:读取每行数据,依次将每行数据解析,分别存入字符串列表。维护一个dayNumber数组(最小温差天可能不止一个)0和有一个minDifference变量。依次读取每个字符串列表,通过比较当天的温差与最小温差,确定是否更新dayNumber数组。

Qt 实现如下:

#include <QCoreApplication>
#include<QString>
#include <QFile>
#include <QDir>
#include <QTextStream>
#include <QDebug>

#include <iostream>
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QFile file(QDir::home().absoluteFilePath("E:\\Qt Project\\weather.dat"));
    if(!file.open((QIODevice::ReadOnly))){//打开文档
        qWarning()<<"Open file failed";
        return -1;
    }
    QTextStream stream(&file);
    QString line;
    QVector<QString> dayNumber;
    int minDifference =100;
    while (stream.readLineInto(&line)) {

       QStringList list = line.split(' ', QString::SkipEmptyParts);
       qDebug() << list<< endl;
       if(list.count()>13)
       {
           bool ok1,ok2;
           int maxT = ((QString)list.at(1)).toInt(&ok1, 10);
           int minT = ((QString)list.at(2)).toInt(&ok2, 10);
           qDebug() << maxT<<":"<<minT<< endl;
           if(ok1&&ok2)
           {
               if((maxT-minT)<minDifference)
               {
                   minDifference = maxT-minT;
                   dayNumber.clear();
                   dayNumber.append(list.at(0));
               }else if((maxT-minT) == minDifference)
               {
                   dayNumber.append(list.at(0));
               }
           }else
           {
               qWarning()<<"Day:"<<list.at(0)<<" data type converted failed!"<<endl;
           }
       }
     }
    for(int i =0;i<dayNumber.count();i++)
    {
        qDebug() << "Day:"+dayNumber.at(i)+" has min difference!"<< endl;
    }

    return a.exec();
}

猜你喜欢

转载自blog.csdn.net/u010679316/article/details/78267063
今日推荐