【问题标题】:Running a method on all objects in a HashMap对 HashMap 中的所有对象运行方法
【发布时间】:2014-08-16 11:05:20
【问题描述】:

我想我在重写部分代码以使其更易于维护时误解了 HashMap 的应用。

joints 是一个 HashMap,其中包含一组由 String 标识的对象:

private HashMap<String, SomeObject> joints = new HashMap(5, 1);

通过put() 方法填充HashMap 非常简单。但是我现在需要对它们中的每一个运行一个方法。下面的代码在第一阶段产生语法错误,但我相信它说明了我正在尝试做的事情。

joints.("knee").someMethod(someValue);
joints.("hip").someMethod(someOtherValue);
joints.("shoulder").someMethod(someOtherValue);
joints.("neck").someMethod(someOtherValue);
joints.("elbow").someMethod(someOtherValue);

什么是有效/正确的等价物?上述的?我在想 get() 对象,从地图中删除它,修改对象,将它放回 HashMap。

虽然 foreach 会更接近一步,但这是一种没有实际意义的方法,因为 someMethod() 的争论因每个对象而异。

【问题讨论】:

标签: java foreach hashmap


【解决方案1】:

要访问Map 中的特定值(而不是循环遍历它们),请使用get 方法。

joints.get("knee").someMethod(someValue);

【讨论】:

    【解决方案2】:

    一个不错的方法可能是使用泛型方法。

    首先,使用您的方法定义一个接口,该接口对映射中的所有值都是通用的:

    public interface SomeInterface {
    
        public void someMethod();
    
    }
    

    然后,您可以遍历您的地图并为每个值调用通用方法:

    public <T extends SomeInterface> void callMethodOnValues(Map<String, T> map) {
        for (T value : map.values()) {
           value.someMethod();
        }
    }
    

    【讨论】:

    • 现在详细说明我们如何使用someValuesomeOtherValue,您的回答将堪称典范。
    【解决方案3】:

    如果从key 中检索到的value 是实现someMethod() 的类的实例,那么它将是这样的:

    for(String key: joints.keySet())
    {
       someObject obj = joints.get(key);
       obj.someMethod(value);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-23
      • 2011-06-09
      • 1970-01-01
      • 1970-01-01
      • 2019-05-19
      • 2013-01-31
      • 2015-04-19
      相关资源
      最近更新 更多