【问题标题】:Java: Using a hashmap, retrieving all values and calling methodsJava:使用哈希图,检索所有值并调用方法
【发布时间】:2011-09-16 00:20:26
【问题描述】:

我需要存储一个动态创建的对象列表,以便它们都可以被检索并按需调用它们的方法。

就我所看到的列表和创建而言,HashMap 符合我的需求,但我对使用 HashMap 调用对象和调用它们的方法有点困惑。

作为参考,我给你一点代码:

这里是 HashMap:

Map<String, Object> unitMap = new HashMap<String, Object>();

// here is how I put an object in the Map notice i'm passing coordinates to the constructor:
unitMap.put("1", new Worker(240, 240));
unitMap.put("2", new Worker(240, 240));

现在我需要创建一个方法来检索哈希图中的每个对象并从每个对象中调用一个方法。这是可能的还是只能直接引用创建的对象。如果是这样,是否有另一种方法可以动态调用类的所有现有实例的方法(换句话说,根据用户输入)?

【问题讨论】:

  • HashMaps 具有唯一的键,因此您只能为每个键值插入一个对象(在您的情况下为“1”)。要访问所有成员,只需按照下面的答案遍历容器即可。
  • @Kerrek 抱歉打错了,我的意思是让每个条目都有不同的键。
  • 不要忘记“接受”您认为有用的答案,因此我们欢迎您回答下一个问题! :-)

标签: java android object methods hashmap


【解决方案1】:

当然。你可以这样做:

for (Object thing : unitMap.values()) {
    // use "thing" here
}

如果您也需要密钥,您可以只获取密钥:

for (String key : unitMap.keySet()) {
    // use "key" here
}

或键和值一起:

for (Map.Entry<String, Object> entry : unitMap.entrySet()) {
    // use "entry.getKey()" and "entry.getValue()"
}

在上述所有情况下,map中的每个条目都会被一一遍历。因此,在循环结束时,您将处理地图中的所有条目。

【讨论】:

  • 我有点困惑。在上面的代码中,假设我想使用每个对象调用 getCord() 的方法来检索对象的坐标(它们是不同种类的对象)。如何使用上述方法执行此操作?我会使用“事物”作为一种变量并将“thing.getCord()”放在循环体中吗?对不起,我是初学者,所以我需要特异性。大声笑
  • 在第三种情况下,entry.getValue()Worker 类型的对象;在第一个实例中,thing 同样是一个 Worker 类型的对象。如果有Worker::getCoord() 成员函数,那么确实可以说think.getCoord()entry.getValue().getCoord()
  • @Kerrek SB 在我的代码中使用第一个示例时,事物仅被识别为对象,而不是类型工作者,因此当我使用 thing.getCoord();它没有被识别为成员函数。我猜最坏的情况是,我可以为每种对象类型创建一个哈希图,但是您知道为什么它不适用于每种对象类型吗?
  • @cody:理想情况下,如果这些类型根本不相关,您为每个对象类型使用不同的映射。但是假设您只想将它​​们作为Objects 存储在地图中,您应该首先将对象转换为正确的类型。例如,if (thing instanceof Worker) { return ((Worker) thing).getCoord(); }
  • 啊完美。好的,感谢您的帮助,我想我会重写以实现单独的 HashMap,应该不会那么麻烦,而且它实际上对我的目标有几个好处。
【解决方案2】:

如果地图中的所有值都是Worker 对象,您应该将地图声明为Map&lt;String, Worker&gt; 类型。这样,当您从地图中拉出一个值时,它将被键入为Worker。这样您就可以调用在Worker 上声明的任何方法,而不必在运行时使用instanceof 检查类型。

如果映射包含不同的值,并且您需要将值类型保持为Object,则使用接口来定义您要为每种不同的对象类型调用的方法可能是有利的。

如果您直到运行时才知道要对这些值运行什么方法,并且映射可以保存不同的值,您只需执行当前正在执行的操作,并使用Map&lt;String, Object&gt;

最后,要获取地图的值,请按照我之前提到的 Chris Jester-Young 进行操作。正如我之前所说,最大的优势是您的对象将被键入,并且您无需进行强制转换/实例检查。

【讨论】:

    【解决方案3】:

    我用它把 hashMap 中的所有值放到一个 List 上,希望对你有帮助。

    private List<String> getValuesFromHashMap(HashMap<String, String> hashMap) {
    
        List<String> values = new ArrayList<String>();
    
        for (String item : hashMap.values()) {
            values.add(item);
        }
    
        return values;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-29
      • 2016-02-24
      • 2013-10-18
      • 2019-05-23
      • 2021-07-01
      • 2015-05-10
      • 2017-06-10
      • 1970-01-01
      相关资源
      最近更新 更多