2017-06-02 55 views
0

因此,我试图确保如果从静态哈希映射中的某个项被多次使用,那么它不允许您再次使用它。该计划背后的想法是,一个侦察兵小队每个小队不能有一个以上的“沉重的弹头”和“导弹发射器”。请注意,“heavy bolter”和“missle launcher”是hashmap集合中的两个hashmap键。Java - 确保集合中的项只能使用一次

所以我有一个名为WeaponList的类,它包含一个远程武器的静态散列表。然后我有一个Scout类,它允许侦察兵从构造函数中的默认集合中升级它的远程武器。但是,WeaponList类hashmap中的某些项只能被允许升级到一次。所以如果一个侦察兵升级到一个“Heavy Bolter”并且已经有一个使用该武器的小队成员,升级不应该发生。

有没有办法做到这一点?我已经在Scout类的upgradeRanged方法中尝试了这一行代码。 if (WeaponList.getRanged("Heavy Bolter") > 1))但那不工作,因为我认为使用'>'符号不适用于原始类型和引用类型之间。

我还应该提到,我有另一个名为ScoutSquad的类,它是童子军的聚集。在主程序中创建一个ScoutSquad对象引用,然后将Scout对象添加到ScoutSquad。每个侦察兵都可以单独升级他们的默认武器。 (我也许想过使用ScoutSquad类来确保HashMap中的远程武器不能被使用多次)。

任何与此有关的帮助都会变得更加严谨,如果对问题的解读有困难,我会进行适当的修改。

现在我将提供用于初步认识类的代码:

WeaponList类

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; 
    } 
} 

侦察类(重点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; 
    } 
} 

主程序:

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()返回的对象不是count。您可能需要显式转换为相应的对象并获取属性(在您的案例中计数)。 – Kajal

+0

@Kajal好的,这听起来有点高级给我。我不知道从哪里开始。 – GR412

+0

你说过“我可能想过使用ScoutSquad类来确保HashMap中的远程武器不能被使用多次” - 我认为这是一个好主意,也是更好的方法。在一个特定的阵容中,你可以计算出使用最多N次使用的侦察兵的数量。如果我理解正确,那就是这个逻辑所属的地方。不在全球地图中。 –

回答

0

HashMap.get()返回null如果项目不在Map中。因此你可以这样做:

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

这只是确保项目在HashMap中没有?我需要它,所以只有来自该HashMap的某些项目中的一个可以分配给每个小队除非我看错了。 – GR412