2011-06-16 71 views
2

我需要存储一个动态创建的对象列表,以便可以全部检索它们的方法并根据需要调用它们的方法。Java:使用散列表,检索所有值和调用方法

就我可以看到的列表和创建,一个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)); 

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

+0

HashMaps具有唯一键,所以您只能为每个键值插入一个对象(在您的情况下为“1”)。要访问所有成员,只需在下面的答案中遍历容器即可。 – 2011-06-16 01:50:41

+0

@Kerrek对不起,我打算让每个项目成为不同的关键。 – cody 2011-06-16 02:17:57

+0

不要忘记“接受”你认为有用的答案,所以我们欢迎你回答你的下一个问题! :-) – 2011-06-16 02:32:21

回答

8

当然。你可以这样做:

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()" 
} 

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

+0

虽然我有点困惑。在上面的代码中可以说我想使用每个对象调用getCord()的方法来检索对象的坐标(哪些是不同种类的对象)。我如何使用上述方法做到这一点?我会使用“thing”作为一个变量的类型,并把'thing.getCord()'放在循环体中吗?对不起,我很初学,所以我需要特异性。 lol – cody 2011-06-16 02:13:06

+0

在第三个例子中,'entry.getValue()'是'Worker'类型的对象;在第一个例子中,'thing'同样也是Worker类型的一个对象。如果有'Worker :: getCoord()'成员函数,那么的确可以说'think.getCoord()'或'entry.getValue()。getCoord()'。 – 2011-06-16 02:23:00

+0

@Kerrek SB在我的代码中使用第一个示例时,事物只被识别为对象,而不是作为类型worker,因此当我使用thing.getCoord();它不被认为是一个成员函数。我想最坏的情况下,我可以为每个对象类型创建一个hashmap,但是你有没有想过为什么它不适用于每种对象类型? – cody 2011-06-16 02:47:02

1

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

如果地图保存不同的值,并且需要将值类型保留为Object,则可能有利的是使用接口来定义要为每个不同的对象类型调用的方法。

如果您不知道在运行时需要在值上运行哪种方法,并且地图可以保存不同的值,则只需执行您目前正在执行的操作,然后使用Map<String, Object>

最后,为了得到地图的价值,你就像Chris Jester-Young在我之前提到的一样。正如我之前所说的,最大的优点是您的对象将被键入,并且您将不需要进行投射/实例检查。

0

我用这个将所有来自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; 
}