2017-01-06 1 views
-6

Actuellement, je suis confronté à un problème lors de la migration du projet de Java 6 à Java 8. J'utilise Hashmap pour stocker des données et l'itérer pour former une liste à rendre sur l'interface utilisateur. Changement dans le compilateur changeant l'ordre des champs dans Hashmap (peut être selon la nouvelle implémentation de hashmap java 8) provoquant des champs dans un nouvel ordre aléatoire. C'est briser ma séquence sur l'interface utilisateur. Est-il possible que je puisse avoir une implémentation similaire de n'importe quelle collection dans Java 8 similaire à Hashmaps dans Java 6. J'ai besoin de cela comme solution intermédiaire avant de continuer à changer l'implémentation entière. Appréciez l'aide.Vous voulez utiliser Java 6 Hashmap implémentation en Java 8

+0

Utilisez un 'LinkedHashMap'? – shmosel

+4

Problème XY. Vous avez fait une erreur à l'origine, et maintenant vous cherchez à le perpétuer. Si vous vouliez une commande prévisible, pourquoi avez-vous utilisé une collection qui ne le garantit pas? Utilisez un 'TreeMap'. – EJP

+3

L'ordre des éléments dans un 'HashMap' est ** arbitraire **. Même Java 6 javadoc l'a dit: * "Cette classe ne donne aucune garantie quant à l'ordre ** de la carte, en particulier, elle ne garantit pas que la commande restera constante dans le temps."* Si votre code repose sur l'ordre' HashMap', alors votre code est défectueux/cassé et doit changer.Ne pas perpétuer/pirater le problème en clonant le code Java 6 en Java 8. Corrigez * votre * code. pour une solution intermédiaire, ne pas mettre à jour avant de mettre à jour le code, vous avez dit "intermédiaire", comme à très court terme, non? – Andreas

Répondre

0

Le code source pour HashMap de Java 6 est disponible sous la licence GPL, vous pouvez le copier et l'utiliser dans l'application si cette licence n'est pas un problème.

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

Cela ne doit être utilisé comme une solution temporaire - en fonction de l'ordre d'itération de HashMaps est une mauvaise idée en général. La solution LinkedHashMap pourrait fonctionner s'il fallait un refactoring significatif pour corriger la dépendance à l'ordre d'itération.

+0

Merci Lymia, oui j'ai besoin de revenir en arrière et de refactoriser le code mais je voulais un correctif rapide et temporaire – JavaDev

0

Cela ressemble à de la folie de dépendre d'un ordre aléatoire plutôt que d'un autre ordre aléatoire. De toute façon, si possible, vous devriez:

  • Utilisez un LinkedHashMap. Ceci maintient l'ordre d'insertion, ainsi vous laissera insérer des objets dans l'ordre que vous voulez qu'ils sortent.

Ou:

  • Lorsque itérer/en utilisant le contenu de la carte, tirez les objets dans un List de sorte que vous pouvez trier ou réorganiser selon quels que soient les critères dont vous avez besoin.

Si vous en avez absolument besoin, il est possible d'utiliser le code JDK 6 HashMap dans une application Java 8. Voici les fichiers pertinents pour la mise à jour actuelle de Java 6:

Il semble que HashMap dépend d'un ou deux champs de paquet-privé dans sa superclasse AbstractMap, vous aura besoin d'eux tous les deux. Changez l'instruction package dans chaque fichier pour l'adapter à votre application et donnez-lui une instruction d'importation pour java.util.* et cela fonctionnera.

Et s'il vous plaît rappelez-vous la déclaration au sommet du HashMap documentation:

Cette classe ne fait aucune garantie quant à l'ordre de la carte; en particulier, il ne garantit pas que la commande restera constante dans le temps.

+0

Merci Boann, je crois que nous aurions dû utiliser une collection ordonnée, mais comme elle est hors de contrôle maintenant, je J'ai eu besoin d'un tour rapide, je vais essayer cette option. – JavaDev