Russian Qt Forum
Май 07, 2024, 19:18 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Qhash?  (Прочитано 12562 раз)
Soulq
Гость
« : Май 18, 2011, 13:28 »

Не могли бы вы объяснить работа с QHash? Почитал http://doc.qt.nokia.com/latest/qhash.html не понял :о
Как добавлять элемент? как записывать ключ?
Например я хочу чтобы ключ был аски код строки. Как избавляться от коллизии?
Вот написал чуток кода. думаю не правильно
Код
C++ (Qt)
...// работа с файлом
unsigned mykey;
   int c;
   int t=0;
   QHash <int,QString> myHash;
   while(fgets(result_string,sizeof(result_string),file)){
       i++;
       if(result_string[strlen(result_string)-1] == '\n'){
           result_string[strlen(result_string)-1]='\0';
       }
 
       c = strlen(result_string)-1;
       mykey = 1;
       while(c != -1){
           if(c != 0 )
               mykey = (mykey * toascii(result_string[c]) * c);
           else
               mykey = (mykey * toascii(result_string[c]));
           c --;
       }
       mykey = (mykey * strlen(result_string)) & 100000;
       while(myHash[mykey].isEmpty() == false){
            //t++;
            //std::cout << "LOLOLOL";
           QHash
 
       }
       std::cout<<"MyKey = " << mykey << " ";
       myHash[mykey] = result_string;
       std::cout << result_string <<"\n";
   }
std::cout << "Q = " << t << "\n";
std::cout << i;
}
« Последнее редактирование: Май 18, 2011, 14:02 от Soulq » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Май 18, 2011, 13:56 »

Код
C++ (Qt)
QString rs( result_string );
myHash[ qHash( rs ) ] = rs;
или
Код
C++ (Qt)
QHash< QString, bool > myHash;
myHash[ QString( result_string ) ] = true;
Записан

Qt 5.11/4.8.7 (X11/Win)
Soulq
Гость
« Ответ #2 : Май 18, 2011, 14:09 »

Код
C++ (Qt)
QString rs( result_string );
myHash[ qHash( rs ) ] = rs;
или
Код
C++ (Qt)
QHash< QString, bool > myHash;
myHash[ QString( result_string ) ] = true;
Спасибо. Буду дальше писать Улыбающийся
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #3 : Май 18, 2011, 14:15 »

Для чтения файла лучше используй QTextStream::readLine().
Записан

Qt 5.11/4.8.7 (X11/Win)
twp
Гость
« Ответ #4 : Май 18, 2011, 14:17 »

может более подходящий контейнер в данном случае QSet<QString>
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #5 : Май 18, 2011, 14:21 »

может более подходящий контейнер в данном случае QSet<QString>
+1

Хотя, QHash< QString, bool > =  QSet<QString > Улыбающийся
« Последнее редактирование: Май 18, 2011, 14:26 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
Soulq
Гость
« Ответ #6 : Май 18, 2011, 14:54 »

может более подходящий контейнер в данном случае QSet<QString>
нее, мне надо реализовать словарь.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Май 18, 2011, 15:38 »

нее, мне надо реализовать словарь.
А какой тогда смысл в ключе "кода" строки? Делайте просто
Код
C++ (Qt)
QHash <QString, QString> dictionary;  // напр английское слово - ключ, русское - значение
 
// или так если несколько вариантов перевода
QHash <QString, QStringList> dictionary;
 
Записан
Soulq
Гость
« Ответ #8 : Май 18, 2011, 16:08 »

нее, мне надо реализовать словарь.
А какой тогда смысл в ключе "кода" строки? Делайте просто
Код
C++ (Qt)
QHash <QString, QString> dictionary;  // напр английское слово - ключ, русское - значение
 
// или так если несколько вариантов перевода
QHash <QString, QStringList> dictionary;
 
Ой извиняюсь, мне надо словарь-то для проверки орфографии. Я высчитываю ключ и смотрю то ли слово. Если я буду хранить только ключ то у меня может попасться другое слово с таким же кешом. Вот.

И еще как можно вывести все слова из кеша в text_edit?
Записан
twp
Гость
« Ответ #9 : Май 18, 2011, 16:41 »

Ой извиняюсь, мне надо словарь-то для проверки орфографии. Я высчитываю ключ и смотрю то ли слово. Если я буду хранить только ключ то у меня может попасться другое слово с таким же кешом. Вот.

И еще как можно вывести все слова из кеша в text_edit?
т.е. фактически проверяется наличие слова в хеше?
Записан
Soulq
Гость
« Ответ #10 : Май 18, 2011, 16:42 »

Ой извиняюсь, мне надо словарь-то для проверки орфографии. Я высчитываю ключ и смотрю то ли слово. Если я буду хранить только ключ то у меня может попасться другое слово с таким же кешом. Вот.

И еще как можно вывести все слова из кеша в text_edit?
т.е. фактически проверяется наличие слова в хеше?
совершенно верно
Записан
twp
Гость
« Ответ #11 : Май 18, 2011, 16:52 »

тогда чем не подошел QSet<QString>? ключ не нужно вычислять, просто проверяешь наличие слова в контейнере через QSet::contains()
но тут возникает другая проблема - одно и тоже слово можно написать несколькими вариантами, например слово код:
Код, КОД, код
в QHash как и в QSet это будут разные слова. Т.е нужно делать QString::toUpper() или QString::toLower()


« Последнее редактирование: Май 18, 2011, 16:55 от twp » Записан
Fat-Zer
Гость
« Ответ #12 : Май 18, 2011, 16:54 »

совершенно верно
тогда хватит QSet'а... а если объём словаря большой, то лучше свою структуру на основе дерева использовать.
Записан
Soulq
Гость
« Ответ #13 : Май 18, 2011, 17:15 »

тогда чем не подошел QSet<QString>? ключ не нужно вычислять, просто проверяешь наличие слова в контейнере через QSet::contains()
но тут возникает другая проблема - одно и тоже слово можно написать несколькими вариантами, например слово код:
Код, КОД, код
в QHash как и в QSet это будут разные слова. Т.е нужно делать QString::toUpper() или QString::toLower()
совершенно верно
тогда хватит QSet'а... а если объём словаря большой, то лучше свою структуру на основе дерева использовать.
Сейчас попробую.
Насчет toLower() - это да)

А добавлять и проверять наличие как?
что-то вроде:
Код
C++ (Qt)
mySet.insert(rs);
 
?
« Последнее редактирование: Май 18, 2011, 17:21 от Soulq » Записан
twp
Гость
« Ответ #14 : Май 18, 2011, 17:21 »

в ассистенте все есть  Подмигивающий
Код:
// Here's an example QSet with QString values:

 QSet<QString> set;
// To insert a value into the set, use insert():

 set.insert("one");
 set.insert("three");
 set.insert("seven");
// Another way to insert items into the set is to use operator<<():
 set << "twelve" << "fifteen" << "nineteen";
// To test whether an item belongs to the set or not, use contains():

 if (!set.contains("ninety-nine"))
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.181 секунд. Запросов: 22.