| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Visual C++/MFC/WTL > Алгоритм подсчета количества одинаковых строк |
| Автор: avatara 14.11.2007, 23:01 |
| Помогите написать код подсчета количества одинаковых строк и определения начальной позиции данной строки в списке. Есть ListBox, в котором находятся данные типа: АА АА АА АА АБ АБ АБ АВ АГ АГ АД ЕЕ ЕЕ КР КР МО МО ПС Необходимо в EditBox вывести данные таким образом: АА - позиция 0, кол-во 4; АБ - позиция 4, кол-во 3; АВ - позиция 7, кол-во 1; АГ - позиция 8, кол-во 1; АД - позиция 10, кол-во 1; ЕЕ - позиция 11, кол-во 2 ....... и т.д. Данные уже отсортированы, затруднение вызывает написание кода подсчета. Спасибо. |
| Автор: avatara 15.11.2007, 11:31 | ||
| Это надо было, чтобы узнать начальный индекс данной строки и количество. На самом деле все немного сложнее. В проекте есть ListCtrl, в котором 2 столбца - Серия и Номер например ЖХ 222222 ЖЦ 222223 ЖЦ 333333 ЖЦ 222221 ЖЦ 444440 ЖЦ 344444 ЖЦ 322222 ЖЦ 311111 ЖЧ 332222 ЖЧ 355555 ЖЧ 111111 ЖЧ 355555 ЖЧ 322221 ЖЧ 355555 ЖЧ 355554 ЖЧ 355553 ЖЧ 366666 ЖЧ 366667 ЖЧ 366669 ЖЧ 366668 ЖЧ 300000 ЖЧ 363910 ХЩ 295363 в первом столбце данные уже отсортированы по алфавиту, и нужно отсортировать данные во втором столбце соответственно внутри СЕРИИ Вот две функции
Сама функция сортировки PuzirikSort работает правильно, если указывать числовые значения в ее параметрах, а если использовать переменные pos и count то часть данных просто изчезает, а вместо них появляются дубликаты имеющихся. Посмотрите, в чем проблемы. На всякий случай прикрепляю файл с проектом. В папке ДЕБАГ есть текстовые файлики с данными для загрузки. |
| Автор: Ln78 15.11.2007, 13:23 | ||
avatara, я не понял, что тебе нужно: решить задачу с сортировкой самому, или просто, чтобы было всё отсортировано. Если второе - лучше воспользоваться готовыми алгоритмами, типа sort. Или другими контейнерами, в которых такая сортировка происходит автоматически, на этапе заполнения, например, map. Например, в твоей функции OnBnClickedButton1 можно написать что-то вроде
Здесь я, правда, дважды поленился: если используется не одна CString, а какая-нибудь структура, то для неё нужно определить операцию "меньше", чтобы использовать map. И лучше, по соображениям эффективности, использовать дополнительный класс - указатель на структуру, чтобы уменьшить число операций копирования. Если это интересно, я могу позже (когда будет свободное время) написать этот фрагмент с учётом этих замечаний. |
| Автор: avatara 15.11.2007, 14:03 |
| Да, нужно чтобы все было отсортировано - СЕРИИ по алфавиту и НОМЕРА по возрастанию внутри серии. Серии уже отсортированы и нужно сортировать только номера в серии. Сортировать можно как угодно, хоть собстренную делать сортировку, хоть использовать стандартные метоты. Я не очень силен в программировании и с контейнером map еще невстречался. Делаю проект MFC application в Visual Studio 2003.net подскажите Какие инклюды сделать чтобы Ваш пример заработал. |
| Автор: Ln78 15.11.2007, 15:04 | ||
Нужно добавить
В самой функции я специально первую и последнюю строчки привёл из оригинала, чтобы проще можно было определить, что на что поменять. Других изменений вроде я не делал. |
| Автор: avatara 15.11.2007, 15:53 |
| Сделал, все заработало, за исключением одного НО. Серии стали сортироваться в другом порядке. В программе серии должны отсортированы согласно украинского алфавита а б в г ґ д е є ж з і ї й к л м н о п р с т у ф х ц ч ш щ ю я ь Поэтому в исходном файле, который загружается в программу, такая сортировка уже сделана по сериям согласно украинскому алфавиту В данном случае при загрузке файла с данными происходит пересортировка серий. И в результате серии с начальными буквами Є, Ї, І становятся в самом начале списка, т.е. нарушается порядок следования букв в алфавите. |
| Автор: avatara 15.11.2007, 16:59 | ||
Был бы очень рад, заодно и поучился бы правильно делать такое. |
| Автор: Ln78 15.11.2007, 18:07 | ||
avatara, я, честно говоря, не силён в украинском, увидел какие-то чудные буковки, но не придал этому значения. Возможно, для украинского пройдёт такой вариант
Я как-то и не в состоянии проверить, правильно ли после этого работает. А сама идея с определением операции меньше здесь продемонстрирована, просто здесь - сравнение с учётом украинской (мне так кажется, ни разу до этого не делал |
| Автор: avatara 16.11.2007, 09:38 | ||
По MSDN нашел какие надо сделать инклюды (в stdafx.h)
Выдает ошибки error C2146: syntax error : missing ';' before identifier 'locale' error C2501: '_locale_t' : missing storage-class or type specifiers error C2501: 'locale' : missing storage-class or type specifiers error C3861: '_create_locale': identifier not found, even with argument-dependent lookup Несилен я в STL, простите. |
| Автор: Ln78 16.11.2007, 11:04 | ||
avatara, это мой недосмотр, забыл дописать, что нужно добавить
|
| Автор: avatara 16.11.2007, 11:42 |
| Те же самые ошибки выдает. |
| Автор: Ln78 16.11.2007, 11:56 | ||
Странно, а хэлп что выдаёт? У меня сейчас нет под рукой 2003-й, делал в 2005-й, подключал в NewMarkDlg.cpp, никаких ошибок не выдаётся, в справке указано:
попробуй сделать Rebuild |
| Автор: avatara 16.11.2007, 12:23 |
| Rebuild не помог, сегодня дома поставлю 2005-ю Студию и попробую. Спасибо еще раз. |
| Автор: Ln78 17.11.2007, 11:53 |
| avatara, вот версия файла, чтобы работал в 2003-й VS |
| Автор: avatara 17.11.2007, 16:08 |
| Спасибо огромное, все заработало. Еще раз спасибо. |