В Qt есть класс-контейнер QMap<Key, Value>. А есть ли в Qt такой спец. QMap, который имеет не один, а два ключа: т.е. вначале ищет по одному ключу, если ничего не нашел, пытается поискать по второму ключу!
Для чего это нужно: чтобы при вот таком, предположим, QMap<QString, QString, double> и такой строке:
QString key = "1243";
double i = map[key];
мне кажется тебе нужен не "спец мап" а что-то с логикой поменять.
можешь рассказать поподробней суть задачи.
Альтернатива-то есть, но мне она не нравится, потому что в данном случае поможет, а в других нет. В данном случае, можно попросту делать QMap большего размера и записывать туда 2 разных ключа, но с одним и тем же значением.
Зачем тебе это нужно?
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
Опять же всё зависит от того, что ты собираешься делать с данными из этого файла.
Если эти данные изменятся не будут, то и твоё решение вполне прокатит.
Если же будут изменятся, то лучше сделать так:
Выбираешь "нормальную форму ключа, например для "km|км" пусть это всегда будет строка km (а можно просто enum использовать, если ключи заранее известны)
В мапе хранишь данные для ключей только в "нормальной" форме.
При приходе ключа, сначала преобразовываешь его в "нормальную форму", а потом достаёшь данные.
я бы два словаря использовал:
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
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)