2 votes

Comment utiliser un HashMap comme moyen d'accéder aux éléments d'une liste et de les copier ?

Je travaille sur un jeu vidéo avec un ami. Pour prendre en compte les différents types d'objets, nous avions à l'origine une classe pour chaque objet étendant une classe Item. Comme il n'y avait pas beaucoup de données dans ces classes, j'ai cherché une alternative pour que notre espace de travail ne soit pas si encombré. J'ai commencé à me renseigner sur les HashMaps, et j'ai pensé que c'était un moyen génial d'ajouter des éléments. Nous pouvions également les configurer de telle sorte qu'au lieu d'accéder aux éléments du HashMap avec un int, ce qui en ferait simplement une ArrayList, nous pouvions y accéder avec des Strings. J'ai donc commencé à ajouter cette fonctionnalité, en créant des éléments anonymes dans la classe Item,

    private static Item coal = new Item() {
        weight = .2;
        setImageID(0, 16);
    }

et les ajouter au HashMap.

    itemMap.put("Coal", coal);

Après en avoir fait quelques-uns, j'ai réalisé qu'il n'y avait qu'un seul article de chaque type dans la liste, et que si nous voulions un jour avoir des multiples de ces articles qui pourraient être modifiés sans modifier l'original, nous devrions faire des copies. J'ai commencé à faire des recherches sur la façon de le faire. Nous pourrions utiliser un constructeur de copie, mais il y a trop de variables dans un élément pour que cela soit efficace. Nous pourrions certainement le faire, mais je me demandais s'il y avait une solution simple. Pourrions-nous rendre tous les éléments finaux ? Je ne fais que lancer des idées, car je suis totalement novice dans ce domaine de la programmation. Il se peut aussi que nous fassions tout cela de travers. J'ai juste besoin d'un moyen d'utiliser un HashMap pour créer une sorte de "base de données d'éléments" que je peux utiliser pour accéder à une quantité indéfinie d'un élément de la liste. Des suggestions ?

0voto

Alexander Corwin Points 893

Est-ce qu'un Hashmap<string,ArrayList<Item>> peut-être travailler ? alors au lieu de itemMap.put("Coal", coal) vous devrez vous assurer que itemMap.get("Coal") possède déjà une liste de tableaux, et ajouter le nouvel élément à la liste.

0voto

Juvanis Points 15491

Saviez-vous que vous pouviez spécifier votre carte avec des déclarations comme celles-ci :

HashMap<Integer, Item[]> map = new HashMap<Integer, Item[]>();

ou

HashMap<String, Item[]> map = new HashMap<String, Item[]>();

Associer chaque ensemble/réseau/liste d'éléments à un nombre entier ou à une chaîne de caractères pourrait fonctionner pour votre problème.

0voto

yokuyuki Points 98

Si je comprends bien, vous devriez avoir une liste de tous les éléments à l'intérieur de chacun des HashMap pour accéder à plusieurs éléments sous un type d'élément. Pour ce faire, il suffit de créer un HashMap<String, ArrayList<Item>> . Lorsque vous créez un type d'élément pour la première fois, créez un nouveau ArrayList<Item> et lors de l'ajout d'éléments ultérieurs du même type, il suffit de les ajouter à la liste.

Cependant, HashMap n'est pas aussi efficace pour cela. Si vous avez une quantité connue de types d'éléments, je ferais en sorte qu'il s'agisse de ArrayList<ArrayList<Item>> de telle sorte que vous initialisiez la ArrayList externe avec une InitialCapacity égale au nombre de types d'éléments que vous avez et que vous ayez une méthode qui convertisse le nom du type d'élément en l'index qu'il est stocké dans la ArrayList externe afin d'être plus efficace en mémoire en raison de l'absence de facteur de charge et de contourner l'overhead de la fonction de hachage. Une alternative à la méthode qui convertit le nom de l'élément en index est peut-être d'ajouter un identifiant de type d'élément à chaque type d'élément.

Donc vous l'auriez fait :

class Coal {
    public int id = 0
}

En supposant que votre ArrayList externe soit nommée itemTypes et votre article est coal l'ajout serait simplement :

itemTypes.get(coal.id).add(coal)

C'est à vous de choisir l'implémentation que vous souhaitez utiliser. L'implémentation de HashMap est plus simple et nécessite moins de code à écrire, mais elle est moins performante et utilise plus de mémoire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X