2017-01-06 4 views
-6

В настоящее время я сталкиваюсь с проблемой во время миграции проекта с java 6 на java 8. Я использую Hashmap для хранения некоторых данных и итерации, чтобы сформировать список для отображения в пользовательском интерфейсе. Изменение в компиляторе, изменяющее порядок полей в Hashmap (может быть в соответствии с новой реализацией хэш-карты java 8), вызывая поля в новом случайном порядке. Это нарушает мою последовательность в пользовательском интерфейсе. Есть ли способ, которым я могу иметь подобную реализацию любой коллекции в Java 8, похожей на Hashmaps в Java 6. Мне нужно это как промежуточное решение, прежде чем я продолжу изменять всю реализацию. Цените помощь.Хотите использовать реализацию Java 6 Hashmap в Java 8

+0

Использовать 'LinkedHashMap'? – shmosel

+4

XY проблема. Сначала вы сделали ошибку, и теперь вы пытаетесь увековечить ее. Если вы хотите предсказуемый порядок, почему вы использовали коллекцию, которая не гарантирует ее? Используйте «TreeMap». – EJP

+3

Порядок элементов в 'HashMap' ** произвольный **. Даже Java 6 javadoc сказал так: * «Этот класс не дает никаких гарантий относительно порядка ** карты, в частности, он не гарантирует, что порядок останется постоянным с течением времени.* * Если ваш код зависит от порядка 'HashMap', то ваш код является ошибочным/сломанным и ему нужно изменить. Не переусердствуйте/не взломайте проблему, клонировав код Java 6 в Java 8. Исправьте * ваш * код. для промежуточного решения, не обновляйте. Исправляя код перед обновлением. Вы сказали «промежуточный», как в краткосрочной перспективе, правильно? – Andreas

ответ

0

Исходный код для HashMap Java 6 доступен под лицензией GPL, вы можете скопировать его и использовать в приложении, если эта лицензия не является проблемой.

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/HashMap.java

Это должно быть использовано только в качестве временного решения - в зависимости от порядка итераций HashMaps плохая идея в целом. Решение LinkedHashMap может работать, если потребуется значительное рефакторинг, чтобы исправить зависимость от порядка итерации.

+0

Спасибо, Lymia, да, мне нужно вернуться и получить код рефакторинга, но мне нужно быстрое и временное исправление. – JavaDev

0

Звучит как безумие, зависящее от одного случайного упорядочения, а не от случайного упорядочения. В любом случае, если это возможно, вам необходимо:

  • Использовать LinkedHashMap. Это поддерживает порядок вставки, поэтому позволит вам вставлять объекты в том порядке, в котором вы хотите, чтобы они выходили.

Или:

  • При переборе/с использованием содержимого карты, тянуть объекты в List, так что вы можете сортировать или изменить его в соответствии с каким-либо критериям, что вам нужно.

Если вам абсолютно необходимо, в приложении Java 8 можно использовать код JHK 6 HashMap. Вот соответствующие файлы для текущего обновления Java 6:

кажется, что HashMap зависит от нескольких пакетов-частных полей в суперкласса AbstractMap, так что вы им понадобятся. Измените оператор package в каждом файле, чтобы он соответствовал вашему приложению, и дайте каждому из них заявление на импорт для java.util.*, и оно будет работать.

И, пожалуйста, помните заявление в верхней части HashMap documentation:

Этот класс не дает никаких гарантий относительно порядка отображения; в частности, он не гарантирует, что порядок будет оставаться постоянным с течением времени.

+0

Большое спасибо Boann. Я понимаю, что мы должны были использовать какую-то упорядоченную коллекцию, но, поскольку она сейчас не контролируется, я Нужно было немного быстро развернуться. Я попробую этот вариант. – JavaDev