2010-04-19 3 views
1

Pour mon programme de trading, un objet Marchand a une qualité HashMap de Qualités énumérées avec des valeurs booléennes.Une méthode Java simple pour passer des parties d'un hashmap à un autre hashmap?

public class Merchants { 
    private Map<Qualities, Boolean> qualities = new HashMap<Qualities, Boolean>(); 

Je voudrais donner à chaque objet marchand un autre ratedQualities HashMap de vraies qualités avec octet ou valeurs entières représentant la notation de ces qualités. Par exemple, un marchand donné pourrait avoir une cote «1» associée à sa véritable qualité de stock.

Le problème est que Java ne me laisse pas le faire facilement. Le code suivant montre mes intentions, mais ne compile pas:

private Map<qualities-TRUE, Byte> ratedQualities = new HashMap<qualities-TRUE, Byte>(); 

Selon cette link text une solution consiste à créer un wrapper pour les qualités HashMap. Est-ce la seule solution ou existe-t-il un meilleur moyen?

Merci d'avance pour votre aide.

+2

Pourquoi avez-vous besoin du mapping booléen? Ne pouvez-vous pas remplacer cela avec la carte ne contenant pas simplement une entrée pour les clés que vous auriez mappé à faux? –

+0

@ Thomas Lotzer, j'utilise la cartographie booléenne pour déterminer quels marchands ont plusieurs qualités. En supposant que votre suggestion est faisable, je vais essayer à l'avenir de remplacer cela par une carte contenant uniquement les entrées qui sont vraies. – Arvanem

+1

En suivant le commentaire de Thomas, si vous abandonnez des valeurs fausses, remplacez le type de valeur par Integer, puis vous aurez à la fois les qualités et leur taux respectif dans une seule carte. –

Répondre

6

Voici une implémentation de Merchant utilisant les idées préconisées par Thomas Lötzer et d'autres.

class Merchant 
{ 
    Map<Quality, Integer> ratings = new HashMap<Quality, Integer>(); 

    boolean hasQuality(Quality quality) 
    { 
     return ratings.containsKey(quality); 
    } 

    int getRatingOfQuality(Quality quality) 
    { 
     Integer rating = ratings.get(quality); 
     return (rating != null) ? rating : 0; 
    } 

    void setRatingOfQuality(Quality quality, int rating) 
    { 
     ratings.put(quality, rating); 
    } 
} 
+0

Merci pour votre aide. Je vous ai mis à jour, Thomas, Eyal et Aaron, qui méritent tous le mérite de cette réponse. – Arvanem

2

Y a-t-il un problème que je ne vois pas avec simplement boucler sur les entrées de qualities et l'ajouter à un vide ratedQualities si la valeur de l'entrée dans qualities est égale à vrai?

Ce serait mon approche si j'ai bien compris votre question.

+0

Merci pour votre réponse. Tu as raison qu'une boucle pourrait faire ça. Cependant j'espérais qu'il y avait un moyen simple d'initialiser ceci, car j'ai de nombreuses classes similaires aux Marchands avec de nombreux attributs similaires stockés dans HashMaps. – Arvanem

2

Je propose de remplacer le Boolean sur la carte qualities avec un Integer et traiter Boolean.FALSE comme Integer.valueOf(0).

+0

Merci pour votre réponse. +1 pour la suggestion Boolean.FALSE être Integer.valueOf (0). – Arvanem