【问题标题】:How can I achieve a similar result to naming each instance of a class after the values of different strings?如何在不同字符串的值之后命名类的每个实例来获得类似的结果?
【发布时间】:2016-05-29 00:18:08
【问题描述】:

我希望获得与执行以下操作相同的结果:

我有一个名为Territory 的类,其中每个实例的值都将被命名为String[] countryNamesTerritory 有两个内部变量,playernumberOfArmies

要创建每个 Territory 实例 (public Territory(String player, int numberOfArmies)),我将创建一个循环遍历每个 countryNames,创建一个具有此名称的新 Territory,并将 playernumberOfArmies 分配给这个Territory。大致如下:

countryNumber = 0;
for (int i = 0; i < playerNames.length(); i++) {
    Territory countryNames[countryNumber] = new Territory(playerNames[j], 0);
    countryNumber++;
}

这是一个假设玩家和国家数量相同的简单示例。在我的计划中不会出现这种情况 - 玩家可以被分配到多个地区。

我知道 Java 不支持获取 String 的值并将其分配给变量的名称 - 那么我还有什么其他方法可以创建某种数据结构,其中每个元素都有一个名称和两个变量?我还没有真正研究过 Java 中的地图,但我认为某种地图可能是解决方案。

【问题讨论】:

  • 如果一个Territory应该有一个名字,为什么Territory类里面没有一个name属性?
  • 因为唯一需要使用名称的时候是访问类并获取playernumberOfArmies。通过给它一个内部name 变量,我将在类中获得国家/地区的名称,但仍需要将这个类实例的实际名称与国家/地区相关联。
  • 将玩家姓名关联到地区和将国家/地区名称关联到地区有什么区别?我认为这基本上是同一件事:领土是给定的国家和给定的玩家。那么,为什么在 Territory 中可以有 playerName 属性,而没有 countryName 呢?
  • 这并没有什么问题——只是我仍然需要在外部将每个Territory 与每个国家/地区关联起来。如果我有 50 个国家,想知道哪个玩家占领了澳大利亚,我必须找到与澳大利亚相关的Territory。我认为最好的方法是调用Australia.getPlayer()
  • 没有。那是不可能的。您不能动态创建变量。但是您可以遍历所有地区(将存储在数组或列表中),找到国家为“澳大利亚”的地区,然后从中获取玩家姓名。当然,使用 Map 也很好,但这些并不是相互矛盾的技术。如果一个地区与一个国家/地区相关联,您可能需要执行 someTerritory.getCountry() 来了解它,而不必去地图。

标签: java string class dictionary hashmap


【解决方案1】:

你可以使用HashMap:

HashMap<k,v> map = new HashMap<>();

其中 k 应该是字符串名称,v 应该是元素。要添加和进入 HashMap,您必须使用 .put(k,v); 方法。

希望这会有所帮助。

【讨论】:

  • 我仍然需要存储与每个Territory 关联的numberOfArmies。是否可以使用一个键和 2 个变量创建一个 HashMap?
  • numberOfArmies 是 Territory 中的一个变量,所以只需将整个对象添加到 hashMap 中。 map.put(name, new Territory(player, numberOfArmies);
  • @CornOnTheKob 地图可以包含任何类型的对象。你想要一个Map&lt;String, Territory&gt;。为什么不阅读集合教程和 javadoc? docs.oracle.com/javase/tutorial/collections
  • @Carles 好的,我明白了。所以如果我在类中有一个getPlayer() 方法并调用map.put("Australia", new Territory("John", 10)),我可以通过调用map.get(Australia.getPlayer()) 来访问这个名称吗?
  • 不,您可以通过map.get("Australia").getPlayer() 访问该名称。 map.get("Australia") 传递属于澳大利亚的Territory 对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-06
  • 1970-01-01
  • 1970-01-01
  • 2022-06-29
  • 2010-10-28
相关资源
最近更新 更多