![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
hardfun |
|
|||
Новичок Профиль Группа: Участник Сообщений: 26 Регистрация: 21.12.2007 Репутация: нет Всего: нет |
hi all.
Имеется большой список названий клиентов в кодировке Win-1251 (в моём примере он составляет 50000 строк). Этот список был загружен из текстового файла в TreeMap<Integer, String> с компаратором, который при добавлении новых пунктов сортирует их по алфавитному принципу. В результате получился TreeMap-объект, значения которого упорядочены (условно этот объект я называю treeMapObj). Затем к этому "деревомапу" была применена операция treeMapObj.values().toArray(new String[0]), что дало в результате массив строк. Его элементы (первые 25 строк) был выведен в окне отладчика. Также значения "деревомапа" были выведены в текстовый файл. К моему немалому удивлению, значения коллекции, полученной вызовом метода treeMapObj.values().toArray(....), оказались... "не совсем" упорядоченными по алфавиту! То есть, порядок следования элементов в нескольких местах НАРУШАЛСЯ. ![]() Просмотр исходника метода values() показал, что этот метод просто возвращает переменную с именем = `values`. Код метода toArray() в Collection.java я понять не смог, т.к. в нём записано вот это вот: <T> T[] toArray(T[] a); -- и всё. ВОПРОС: по какому принципу java формирует массив строк ? Там что, выполнение идёт в несколько потоков и они, потоки эти, "толкаются" и путают результирующий порядок элементов что ли ?! ЗЫ. Иллюстрации в виде двух скриншотов прилагаются. В одном из них - окно отладчика NetBeans с раскрытыми элементами объекта, вычисленного в Evaluate-окне как treeMapObj.values() . Во втором окне - фрагмент текстового файла, открытого в FAR'e. Нужные строки (с 16 по 19) выделены. Обратите внимание, что в текстовом файле строки упорядочены ПРАВИЛЬНО, т.е. сам treeMapObj содержит значения в ПРАВИЛЬНОМ порядке следования. Присоединённый файл ( Кол-во скачиваний: 7 ) ![]() |
|||
|
||||
ivg |
|
||||
![]() Autonomous R&D ![]() ![]() Профиль Группа: Участник Сообщений: 686 Регистрация: 8.2.2006 Где: Екатеринбург Репутация: 33 Всего: 81 |
Здесь сортировка вроде осуществляется по ключу, а не по значению. Что за компаратор, который сравнивает по алфавитному принципу (я надеюсь я правильно понял, что речь идёт о строках) и как вы его привязали к TreeMap<Integer, String>. Если через конструктор - то он должен быть Comparator<Integer>, а не Comparator<String> JavaDoc по методу TreeMap.values();
то есть значения массива будут упорядочены в порядке возрастания соответствующих ключей. Вобщем если сами не разберётесь, приведите код, который загружает TreeMap<Integer, String>, код компаратора, а так же код вывода в текстовый файл (который в правильном порядке) |
||||
|
|||||
hardfun |
|
|||
Новичок Профиль Группа: Участник Сообщений: 26 Регистрация: 21.12.2007 Репутация: нет Всего: нет |
2ivg: спасибо Вам за ответ.
Повторные интенсивные тесты эту "странность" не выявили. Я бы мог признать, что "глаза замылил", но в таких случаях всегда делаю скриншот (который выложил в предыдущем посте: там явно видно, что алфавитная сортирока НЕ соблюдена). В этот раз был проведен тест загрузки списка в TreeMap-модель и выгрузки в новые текстовые файлы двумя способами: 1) обходом в цикле MAP-коллекции, которая является моделью списка; 2) вызовом метода listMap.values().toArray(new String[0]), который создаёт массив строк. Затем - проход по эому массиву. Оба файла-результата были сравнены побайтно, их содержимое оказалось идентично. ЗЫ. Насчет компараторов: я не сразу понял, как они работают. Уже после я выяснил, что после заполнения TreeMap'a данными НЕупорядоченного списка элементы в этом "деревомапе" при доступе к ним через treeMapObj.get(i), где i=0,1,2,... -- возвращаются также в НЕупорядоченном виде. Для получения упорядоченной последовательности строк надо обходить этот "деревомап" через итератор. Но всё равно это проще (имхо), чем манипулировать с приведением текущей модели списка к списку СТРОК (через .toArray() и Arrays.asList()), чтобы после передать этот список в Collections.sort(). Или я не прав и данные модели JList'a можно упорядочить каким-то быстрым и, главное, КОРОТКИМ способом ? |
|||
|
||||
LSD |
|
||||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
В TreeMap упорядочиваются не ключи и значения, а пары ключ-значение, причем порядок определяется ключем, значение не оказывает на него никакого влияния.
на выходе получим:
т.е. пары a-3, b-1, c-4, d-2 сохранены, и идут в том порядке в котором идут ключи. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |