Java - 确保 collection 中的物品只能使用一次

Java - Ensuring an item from a collection can only be used once

所以我试图确保如果静态哈希图中的某个项目被多次使用,那么它不允许您再次使用它。该计划背后的想法是,一个 Scout 小队的每个小队不能超过一个 "heavy bolter" 和 "missle launcher"。请注意,"heavy bolter" 和 "missle launcher" 是散列映射 collection.

中的两个散列映射键

所以我有一个名为 WeaponList 的 class,它包含远程武器的静态哈希图。然后我有一个 Scout class 允许 Scout 从构造函数中的默认设置升级它的远程武器。然而,WeaponList classes hashmap 中的某些项目只允许升级一次。因此,如果 Scout 升级到 "Heavy Bolter" 并且已经有一名小队成员拥有该武器,则不应进行升级。

有办法吗?我已经在 Scout classes upgradeRanged 方法中尝试了这行代码。 if (WeaponList.getRanged("Heavy Bolter") > 1)) 但这行不通,因为我认为使用“>”符号在原始类型和引用类型之间不起作用。

我还应该提一下,我还有另一个名为 ScoutSquad 的 class,它是 Scouts 的集合。在主程序中,您创建一个 ScoutSquad Object 引用,然后将 Scout objects 添加到 ScoutSquad。每个 Scout 都可以单独升级他们的默认武器。 (我可能正在考虑使用 ScoutSquad class 来确保 HashMap 中的远程武器不能被多次使用)。

如有任何帮助,我们将给予帮助,如果对问题有任何混淆,请告诉我,我会进行适当的更改。

我现在将提供相关的代码 classes:

武器列表Class

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

Scout class(关注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();
    }   
}

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

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

将此添加到 ScoutSquad Class:

public boolean checkUses(String weapon) {
  for (Scout scout : scouts)
    if (scout.getRangedUpgrade() == WeaponList.getRanged(weapon)
      return true;
  return false;
}

更改 rangedUpgrade Scout 的方法 Class:

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