【问题标题】:How to assign multiple values to a single string in Java with an array?java - 如何使用数组为Java中的单个字符串分配多个值?
【发布时间】:2019-04-15 21:55:27
【问题描述】:

目前我正在创建一个 MUD 游戏,作为我在 Java 中的第一个严肃项目,我已经设置了知识和背景,我只需要启动实际代码。我首先尝试像这样创建一组敌人:

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

但我显然不能像那样在 Java 中做到这一点。有没有办法在Java中为字符串分配一个值(有点像python中的键值对,但为一个字符串分配了多个值),如果是这样,我有办法访问和操作分配给字符串?

【问题讨论】:

  • 您可能需要使用Map<String, String[]>Map<String, List<String>> 来存储它。
  • 使用hpmpatk 字段创建一个Enemy 类。然后创建Enemy 对象的集合。如果你不打算使用对象,那么做 OO 是没有意义的。
  • 我会创建一个包含这些字段的类,然后有一个这个新类的数组
  • 使用Object[] 是“简单”的方法,但那样你不会获得类型安全。
  • "easy" != "nice"

标签: java arrays


【解决方案1】:

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

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 来链接 setter,此外它还减少了很多样板代码(getter、setter、构造函数)。检查@Data@Accessors(chain = true)

【讨论】:

  • 感谢您的回答。它比我预期的要全面得多。您甚至链接了一些资源以使这项工作更容易并占用更少的代码。我将研究在我的项目中实现地图和类(针对敌人)。
【解决方案2】:

你可以在java中使用Map

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

【讨论】:

    【解决方案3】:

    两种方式:一种是使用数组。要在 Java 中获得“松散”的语义,只需使用 Object[]。这可行,但效果不佳。

    Object[][] enemies1  = {{"Weak Skeleton:", 100, 0, 100},
                            {"Blue Slime:", 50, 0, 25},
                            {"Novice Rogue Mage:", 25, 100, 0}};
    

    如前所述,一个更好的想法是创建一个更语义化的类型,例如 Enemy,并创建该类型的新对象。

    Enemy[] enemies1 = { new Enemy( "Weak Skeleton:", 100, 0, 100 ),
                         new Enemy( "Blue Slime:", 50, 0, 25 ),
                         new Enemy( "Novice Rogue Mage:", 25, 100, 0 ) };
    

    【讨论】:

      【解决方案4】:

      你可以创建代表敌人的类

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

      【讨论】:

      • 我不会把名字和统计数据分开。这似乎是错误的方向。
      • @markspace 从设计的角度来看我同意你的观点,但我试图提供最小的例子。
      【解决方案5】:

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

       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);
      ...
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-03
        • 2016-08-09
        • 1970-01-01
        相关资源
        最近更新 更多