如何在Java中使用数组将多个值分配给单个字符串?

时间:2018-11-13 05:58:25

标签: java arrays

当前,作为我的第一个Java认真项目,正在创建一个MUD游戏,我已经设置了知识和背景知识,我只需要开始实际的代码即可。我首先尝试创建像这样的敌人集:

//                       Name,     HP,  MP, ATK
enemies[] = {"Weak Skeleton:",    100,   0, 100;
             "Blue Slime:",        50,   0,  25;
             "Novice Rogue Mage:", 25, 100,   0;}

但是我显然不能在Java中那样做。在Java中是否可以为字符串分配一个值(类似于python中的键/值对,但是将多个值分配给一个字符串),如果可以,我可以通过一种方式来访问和操作分配给字符串的整数值字符串?

5 个答案:

答案 0 :(得分:2)

最合适的方法是让一个对象代表您所拥有的值的组合;

public class Enemy {

    private String name;
    private Integer healthPoint;
    private Integer manaPoint;
    private Integer attackPower;

    // getter, setter, constructors
    // example constructor
    public Enemy(String name, Integer hp, Integer mp, Integer ap) {
        this.name = name;
        this.healthPoint = hp;
        this.manaPoint = mp;
        this.attackPower = ap;
    }
}

然后根据需要在地图上显示;

List<Enemy> enemies = new ArrayList<>();
enemies.add(new Enemy("Weak Skeleton", 100, 0, 100));
enemies.add(new Enemy("Blue Slime", 50, 0, 25));
enemies.add(new Enemy("Novice Rogue Mage", 25, 100, 0));
Map<String, Enemy> enemyMap = enemies.stream().collect(Collectors.groupingBy(Enemy::getName));

因此,如果您需要访问和编辑任何值,可以很容易地通过以下方式进行操作:

enemyMap.get("Weak Skeleton").setAttackPower(75);

或添加新敌人;

Enemy dragonBoss = new Enemy("Dragon Boss", 1000, 500, 250);
enemyMap.put(dragonBoss.getName(), dragonBoss);

尽管,我建议使用一些枚举来识别每个敌人,但是尝试使用名称为String的访问不是最佳实践。

public enum EnemyType { 

    WEAK_SKELETON("Weak Skeleton"), BLUE_SLIME("Blue Slime"), NVC_ROGUE_MAGE("Novice Rogue Mage"); 

    private String name; 

    public String getName() { 
        return this.name; 
    }

    private EnemyType (String name) {
        this.name = name;
    } 
} 

并将其用作地图中的名称/键。

如果您愿意,可以选择Lombok,将其链接到设置程序,而且它会减少很多样板代码(getter,setters,构造函数)。用@Data检查@Accessors(chain = true)

答案 1 :(得分:1)

您可以在Java中使用Map

Map<String,List<Integer>> enemies1 = new HashMap<>();
enemies1.put("str1",list1);
enemies1.put("str2",list2);
enemies1.put("str3",list3);

答案 2 :(得分:1)

两种方法:一种是仅使用数组。要在Java中获得“丢失”的语义,只需使用{month:regex(\\d{2}):range(1,12)}。这行得通,但不是很好。

Object[]

如上所述,一个更好的主意是创建一个更语义化的类型,例如Object[][] enemies1 = {{"Weak Skeleton:", 100, 0, 100}, {"Blue Slime:", 50, 0, 25}, {"Novice Rogue Mage:", 25, 100, 0}}; 并创建该类型的新对象。

Enemy

答案 3 :(得分:1)

在更改语言时,您需要更改方法以考虑数据
您想要实现的目标,可以通过以下方式实现:

 class Data{
    //Choose your access-specified as per your need
    public int hp, mp, atk;
    public Data(int h, int m, int a)
    { hp = h; mp=m; atk=a;}
 }
 ...
 HashMap<String,Data> dataSet = new HashMap<>();
 dataSet.put("val1", new Data(50,40,30));
 ...
 Data d = dataSet.get("val1");
 System.out.println("Value of HP is:" + d.hp);
...

答案 4 :(得分:0)

您可以创建代表敌人的课程

public class Enemy {
    private int hp;
    private int mp;
    private int atk;

    public Enemy(int hp, int mp, int atk) {
        this.hp = hp;
        this.mp = mp;
        this.atk = atk;
    }

    public int getHp() {
        return hp;
    }

    public void setHp(int hp) {
        this.hp = hp;
    }

    public int getMp() {
        return mp;
    }

    public void setMp(int mp) {
        this.mp = mp;
    }

    public int getAtk() {
        return atk;
    }

    public void setAtk(int atk) {
        this.atk = atk;
    }
}

然后像这样使用它:

    HashMap<String, Enemy> map = new HashMap<>();

    map.put("Weak Skeleton", new Enemy(100, 0, 100));
    map.put("Blue Slime", new Enemy(50, 0, 25));