【问题标题】:Convert String to the name of a array in another class将String转换为另一个类中的数组名
【发布时间】:2015-06-18 21:31:40
【问题描述】:

我是一名业余程序员,我想知道是否有可能以特定方式解决问题。

public class Stats {

public static int[] Hero = {20, 20, 10, 10, 10};
public static int[] Villain = {20, 20, 10, 10, 10};

public static void name(int[] name) {
    //If you insert an array it will print all its values
    System.out.println("Health: " + name[1] + "/" + name[0]);
    System.out.println("Damage: " + name[2]);
    System.out.println("Defense: " + name[3]);
    System.out.println("Agility: " + name[4]);
    return;
}

这是我想要使用的,如果我使用“英雄”或“恶棍”来调用它,它工作正常。

    public class UserInterface extends JPanel implements MouseListener, MouseMotionListener {

    //A lot of code in between that is not of notice right now

    @Override
        public void mouseClicked(MouseEvent e) {
            if (" ".equals(CHESS.Board[e.getY() / squareSize][e.getX() / squareSize]) == false) {
                //Checks if I pressed on a legit space on the map

                String name = (CHESS.Board[e.getY() / squareSize][e.getX() / squareSize]);
                //In this scenario 'name' will be a String called "Hero"

                System.out.println("Name: " + name);
                //Will write out 'Name: Hero'

                Stats.name(Stats.Hero);
                //Works fine

                Stats.name(Stats.name);
                //Does not work

            }
        }

现在我想要的是根据我点击的内容调用正确的数组。目前我只有名为“Hero”和“Villain”的数组,但最终在一张地图上会有超过 50 多个数组可供选择。显然只是写 stats.name(Stats.name);不起作用,因为名称是一个字符串,它需要一个 int[]。

但是有没有办法使用我的字符串'name',这样我就可以在不同的类中调用一个名为相同事物的 int[] 数组?

【问题讨论】:

  • Java 是一种面向对象的语言,因此,利用所选语言中的功能确实对您有益。您应该创建一个 Person 对象,其中包含 Hero 和 Villain 子类使用的公共字段。 Person 中的字段之一将是名称。其他字段将对应于各种统计数据。有更好的方法可以到达您需要去的地方。
  • 也许这个问题更适合codereview.stackexchange.com

标签: java arrays string class int


【解决方案1】:

我认为您要做的是按名称查找对象。你不能按照你的方式来做,但它很常见,你不必添加太多代码。

假设您有一个 RPG 游戏,并且您有团队成员,每个小计算机人员都按名称标识。

Map<String,RpgPerson> team = new HashMap<>();

这里我们有一种方法可以将字符串(名称)映射到我们想要的对象(具有所有统计信息的对象)。我使用上面的建议来制作一个“Person”对象,因为它确实比使用数组更好。

这是一个简单的例子:

public class RpgPersonExample
{
   public static void main( String[] args )
   {
      Map<String, RpgPerson> team = new HashMap<>();
      team.put( "Sgt. Mayhem", new RpgPerson( 100, 10, 0 ) );
      team.put( "Wizard", new RpgPerson( 100, 1, 10 ) );
      team.put( "Dragon", new RpgPerson( 1000, 100, 100 ) );

      System.out.println( team.get( "Dragon" ) );
      System.out.println( team.get( "Wizard" ) );
   }

}

class RpgPerson
{

   private int hits;
   private int strength;
   private int magic;

   public RpgPerson( int hits, int strength, int magic )
   {
      this.hits = hits;
      this.strength = strength;
      this.magic = magic;
   }

   @Override
   public String toString()
   {
      return "RpgPerson{" + "hits=" + hits + ", strength=" +
              strength + ", magic=" + magic + '}';
   }

}

【讨论】:

  • 我不熟悉地图,但可以更改里面的值吗?例如,如果中士。混乱击中了龙,然后龙的命中将变为'Dragon.(1)=Dragon(1)-Sgt。混乱(2)'。
  • 是的,您可以更改对象,即使它们在地图内。这适用于值(值 = put() 的第二个参数),但不适用于键。如果您更改地图密钥,您将丢失密钥。在这里,String 是不可变的,因此您不会意外更改。
  • 谢谢,另一个问题!如果我想使用另一个类的 HashMap,我该怎么做。假设我有一个新课程。 class Test { public void Xxx { System.out.print( RpgPerson.team.get("Dragon")); return }} 这不起作用,但有没有办法从另一类函数的 HashMap 获取或更改值?
  • 我认为您应该将其作为另一个问题提出。
  • 好吧,我已经做到了。 link
【解决方案2】:

好的。所以你的问题是,根据点击的方块,你想输出相应的日期。现在,要解决您眼前的问题,您需要做的是非常基本的(而且丑陋的)。

引入一些条件逻辑

所以你需要引入另一个 if,这取决于 name 的值是什么。如果name"Hero",则传递一个数组。

if(name.equals("Hero")) {
    Stats.name(Stats.Hero)
}

如果等于Hero,它将输出英雄的统计数据..

这里的问题

这不是很好,但也有点毫无意义。如果每个方格都有各自的名称,那为什么不能采取不同的方法呢?

创建您自己的对象

public class Person {
    private String name;
    private int health;
    // etc...
}

并创建一个Cell 对象..

public class Cell {
    private Person person;

    public Cell(Person person)
    {
        this.person = person;
    }

    public Person getPerson() { return this.person; }
}

现在,您的CHESS.Board 可以是Cell 类型的多维数组。您可以获得正确的Cell,这正是您现在所做的,您可以访问与该单元格关联的Person 对象。这种方法的作用是,它删除了条件逻辑。您可以从单元格中获取Person

Cell cell = (CHESS.Board[e.getY() / squareSize][e.getX() / squareSize]);
Person person = cell.getPerson();

现在,您还可以向Person 类添加一个简单的方法来打印其统计信息。

public void printStats() {
    System.out.println("My name is " + this.name + " and my health is " + this.health);
}

然后您可以致电person.printStats()。这更简洁,条件逻辑更少,并且更紧密地遵循 Java 方法。该解决方案更具可扩展性,您不必弄清楚Hero[3] 的含义。 (下一个编写您的代码的人也不是)。

【讨论】:

    【解决方案3】:

    不要使用字符串来识别程序中的对象。字符串是邪恶的。

    只需将数组(HeroVillain)直接放在CHESS.board 方格中)。您还需要将板的类型更改为 int 数组(因此它将是一个 int 数组数组)。

    您应该按照 Java 约定将变量重命名为以小写字母开头。

    如果必须将字符串映射到对象,可以使用Map

    【讨论】:

      猜你喜欢
      • 2020-06-05
      • 2011-04-10
      • 1970-01-01
      • 1970-01-01
      • 2021-10-03
      • 1970-01-01
      • 2022-06-17
      • 2017-04-14
      • 2017-11-25
      相关资源
      最近更新 更多