2017-06-02 1 views
0

Donc j'essaie de m'assurer que si un certain élément d'un hashmap statique est utilisé plus d'une fois, il ne vous permet pas de l'utiliser à nouveau. L'idée derrière le programme est qu'une escouade scoute ne peut avoir plus d'un «gros bolter» et d'un «lanceur de missiles» par escouade. Notez que "bolter lourd" et "missle lanceur" sont deux clés hashmap dans une collection hashmap. J'ai donc une classe appelée WeaponList qui contient une hashmap statique d'armes à distance. Et puis j'ai une classe Scout qui permet à un Scout de mettre à jour son arme à distance par rapport à celle définie par défaut dans le constructeur. Cependant, certains éléments des classes WeaponList hashmap ne devraient être autorisés à être mis à jour qu'une seule fois. Donc, si un Scout passe à un "Heavy Bolter" et qu'il y a déjà un membre de l'escouade avec cette arme, la mise à niveau ne devrait pas avoir lieu.Java - Garantir qu'un élément d'une collection ne peut être utilisé qu'une seule fois

Existe-t-il un moyen de le faire? J'ai déjà essayé cette ligne de code dans la classe Scout upgradeRanged. if (WeaponList.getRanged("Heavy Bolter") > 1)) Mais cela ne fonctionne pas parce que je pense que l'utilisation du symbole '>' ne fonctionne pas entre les types primitif et de référence.

Je devrais également mentionner que j'ai une autre classe appelée ScoutSquad qui est une agrégation de scouts. Dans le programme principal, vous créez une référence d'objet ScoutSquad, puis ajoutez des objets Scout au ScoutSquad. Chaque Scout peut individuellement améliorer ses armes par défaut. (Je pensais peut-être à utiliser la classe ScoutSquad pour m'assurer qu'une arme à distance du HashMap ne peut pas être utilisée plus d'une fois).

Toute aide avec ce serait apperçu, et s'il ya une confusion avec la question le tme savoir et je ferai les changements appropriés.

Je vais vous donner maintenant le code pour les classes relavant:

WeaponList Classe

public class WeaponList 
{ 
    static Map<String, Ranged> rangedlist = new HashMap<String, Ranged>() 
    {{   
     put("Bolter", new Ranged2H("Bolter", 1)); 
     put("Bolt Pistol", new Ranged("Bolt Pistol", 1)); 
     put("Flamer", new Ranged2H("Flamer", 1)); 
     put("Meltagun", new Ranged2H("Meltagun", 1)); 
     put("Plasma Gun", new Ranged2H("Plasma Gun", 1)); 
     put("Plasma Pistol", new Ranged("Plasma Pistol", 10)); 
     put("Shotgun", new Ranged2H("Shotgun", 10)); 
     put("Sniper Rifle", new Ranged2H("Sniper Rifle", 5)); 

     put("Assault Cannon", new Ranged2H("Assault Cannon", 10)); 
     put("Cyclone Missle Launcher", new Ranged2H("Cyclone Missle Launcher", 10)); 
     put("Heavy Bolter", new Ranged2H("Heavy Bolter", 10)); 
     put("Heavy Flamer", new Ranged2H("Heavy Flamer", 10)); 
     put("Assault Cannon", new Ranged2H("Lascannon", 10)); 
     put("Missle Launcher", new Ranged2H("Missle Launcher", 10)); 
     put("Multi Melta", new Ranged2H("Multi Melta", 10)); 
     put("Plasma Cannon", new Ranged2H("Plasma Cannon", 10)); 
    }}; 

    public static Ranged getRanged(String index) 
    {  
     return rangedlist.get(index); 
    } 

    public static Map<String, Ranged> getRangedList() 
    {   
     return rangedlist; 
    } 
} 

classe Scout (mise au point sur la méthode upgradeRanged)

public class Scout 
{ 
    private Weapon ranged; 
    private int points; 

    //DEFAULT SCOUT 
    public Scout() 
    {  
     ranged = new Ranged("Bolt Pistol", 0); 

     points = 13; 
     points = points + ranged.getWeaponPoints();  
    } 

    public void rangedUpgrade(Ranged ranged) 
    {  
     switch(ranged.toString()) 
     { 
      case "Bolter" : 
      case "Shotgun" : 
      case "Sniper Rifle" : 
      case "Heavy Bolter" : 
      case "Missle Launcher" :    
       this.ranged = ranged; 
       points = points + ranged.getWeaponPoints(); 
      break;   
      default : 
       System.out.println("A Scout can't have a " + ranged);     
     } 

     if (WeaponList.getRanged("Heavy Bolter") > 1)) 
     { 

     } 
    } 

    public Weapon getRangedUpgrade() 
    { 
     return ranged; 
    } 

    @Override 
    public String toString() 
    { 
     return "|| " + "Ranged Weapon: " + ranged + " || " + "Melee Weapon: " + melee + " || " + "Points: " + points; 
    } 
} 

programme principal:

public class ArmyBuilderDemo 
{ 
    public static void main(String[] args) throws Exception 
    {  
     ScoutSquad scouts = new ScoutSquad("Squad 1"); 
     Scanner input = new Scanner(System.in); 

     System.out.println("Enter the squad size: "); 
     int size = input.nextInt(); 

     for (int i = 0; i < size; i++) 
      scouts.addScout(new Scout()); 

     System.out.println(scouts.getScoutSquad()); 

     scouts.getScout(5).rangedUpgrade(WeaponList.getRanged("Heavy Bolter")); 

     System.out.println(scouts.getScoutSquad()); 

     input.close(); 
    } 
} 
+0

Map.get() renvoie l'objet et non le nombre. Vous devrez peut-être convertir explicitement à l'objet respectif et obtenir les attributs (compte dans votre cas). – Kajal

+0

@Kajal D'accord, ça me semble un peu avancé. Je ne saurais pas par où commencer. – GR412

+0

Vous avez dit "Je pensais peut-être à utiliser la classe ScoutSquad pour m'assurer qu'une arme à distance du HashMap ne peut pas être utilisée plus d'une fois" - Je pense que c'est une bonne idée, et la meilleure approche. Dans une équipe donnée, vous comptez le nombre d'éclaireurs qui utilisent la chose que vous voulez utiliser au maximum N fois. C'est là que cette logique appartient, si je comprends bien. Pas dans la carte globale. –

Répondre

0

HashMap.get() renvoie null si l'élément n'est pas présent dans le Map. Par conséquent, vous pouvez le faire:

if(WeaponList.getRanged("Heavy Bolter") != null) { 
    // Already has 
else { 
    // Doesn't have 
} 
+1

Cela garantit que l'élément est dans le HashMap non? Je le veux afin qu'un seul de certains éléments de ce HashMap puisse être assigné à chaque escouade à moins que je ne le regarde mal. – GR412