crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в Есть ли в Qt видоизмененный QMap
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
AD Дата 19.8.2008, 8:58
 
Цитата(trdm)
А почему такой дурацкий формат у файла? csv тут блин намного правильнее использовать...

Так задано, что все входные файлы должны быть формата *.ini!
trdm Дата 18.8.2008, 15:40
 
Цитата(AD @ 18.8.2008, 13:40) *
А если серьезно, то для того, чтобы разобрать этот файл:

А почему такой дурацкий формат у файла? csv тут блин намного правильнее использовать...
AD Дата 18.8.2008, 13:24
 
Цитата(Litkevich Yuriy @ 18.8.2008, 14:14) *
я бы два словаря использовал:
QMap<QString, QString> - m/s = м/с
QMap<QString, double> - m/s = 1

Красиво, я бы сказал, элегантное решение, но ресурсоемкое! Два мепа. Я подумаю, может быть, где-то твой вариант будет очень хорошо подходить! Еще раз огромное спасибо обоим! :) :) :) А в данном случае решение выглядит так. Вроде бы неплохо, тоже:

bool MetricReader::TRead()
{
    bool ret = false;
    if(!open()) return ret;

    QTextStream in(file);
    QString rc= "";
    while(!in.atEnd())
    {
        rc = in.readLine().simplified();
        if(rc.find("//") != -1 || rc.isEmpty()) continue;

        insertValue(rc);
    }

    ret = true;

    QFile* fl = new QFile("test.txt");
    fl -> open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text);
    QTextStream in1(fl);
    for(QMap<QString, double>::iterator iter=metric_map.begin(); iter!=metric_map.end(); ++iter)
        in1 << iter.key() << ":\t\t" << iter.value() << endl;
    fl -> close();

    return ret;
}

void MetricReader::insertValue(QString& rc)
{
    QString left = rc.simplified().section("=", 0, 0).simplified().trimmed();
    QString left_subleft = left.section("|", 0, 0).simplified().trimmed();
    QString right_subleft = left.section("|", 1, 1).simplified().trimmed();

    QString right = rc.simplified().section("=", 1, 1).simplified().trimmed();        bool ok;
    double value = right.toDouble(&ok);

    metric_map.insert(left_subleft, value);
    if(left_subleft != right_subleft)
        metric_map.insert(right_subleft, value);
}


В результате получилось такое:
1:        1
1/km:        0.001
1/км:        0.001
DDM:        11.429
_km:        1
_км:        1
h:        0.017
km:        1000
km/h:        3.6
m:        1
m/s:        1
minute:        1
s:        60
°:        1
РГМ:        11.429
км:        1000
км/ч:        3.6
м:        1
м/с:        1
минут:        1
с:        60
ч:        0.017


P.S. Про нормальную форму теперь понятно! :) Как видно из кода, это делается сразу!
Tonal Дата 18.8.2008, 13:18
  Я примерно это и имел в виду, только к первому словарю часто нужна ещё некоторая обработка, типа убрать пробелы, перевести в нижний регистр...
Поэтому и написал про преобразование в нормальную форму которое в простейшем случаем может свестись к поиску в хеше. :)
Litkevich Yuriy Дата 18.8.2008, 13:14
  я бы два словаря использовал:
QMap<QString, QString> - m/s = м/с
QMap<QString, double> - m/s = 1
AD Дата 18.8.2008, 13:07
 
Цитата(Tonal @ 18.8.2008, 14:02) *
Опять же всё зависит от того, что ты собираешься делать с данными из этого файла.
Если эти данные изменятся не будут, то и твоё решение вполне прокатит.
Если же будут изменятся, то лучше сделать так:
Выбираешь "нормальную форму ключа, например для "km|км" пусть это всегда будет строка km (а можно просто enum использовать, если ключи заранее известны)
В мапе хранишь данные для ключей только в "нормальной" форме.
При приходе ключа, сначала преобразовываешь его в "нормальную форму", а потом достаёшь данные.

Прости, но я не понял как сделать то, что ты предлагаешь! А в моем решении, которое, впрочем, я уже сделал, данные будут изменяться только статически и не очень сильно. Ну попросту добавят еще какие-нибудь размерности в заданном формате и все.
Tonal Дата 18.8.2008, 13:02
  Опять же всё зависит от того, что ты собираешься делать с данными из этого файла.
Если эти данные изменятся не будут, то и твоё решение вполне прокатит.
Если же будут изменятся, то лучше сделать так:
Выбираешь "нормальную форму ключа, например для "km|км" пусть это всегда будет строка km (а можно просто enum использовать, если ключи заранее известны)
В мапе хранишь данные для ключей только в "нормальной" форме.
При приходе ключа, сначала преобразовываешь его в "нормальную форму", а потом достаёшь данные.
AD Дата 18.8.2008, 12:40
 
Цитата
Зачем тебе это нужно?

Зачем, зачем? Нужно и все тут! :) :p

А если серьезно, то для того, чтобы разобрать этот файл:
m/s|м/с            = 1
minute|минут        = 1
m|м            = 1
1|1            = 1
°|°            = 1
_km|_км            = 1

km/h|км/ч        = 3.6
DDM|РГМ            = 11.429
s|с            = 60
h|ч            = 0.017
km|км            = 1000
1/km|1/км        = 0.001

Альтернативное решение я уже привел.
Tonal Дата 18.8.2008, 12:08
  Зачем тебе это нужно?
AD Дата 18.8.2008, 12:01
  Альтернатива-то есть, но мне она не нравится, потому что в данном случае поможет, а в других нет. В данном случае, можно попросту делать QMap большего размера и записывать туда 2 разных ключа, но с одним и тем же значением.
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 28.3.2024, 11:52