Java:使用枚举作为数组引用

Java:使用枚举作为数组引用,java,arrays,enums,Java,Arrays,Enums,我想引用枚举类型的数组。这是C++中的一个非常标准的东西(我的原点),但是我不确定java中是否有可能。 例如,我想要一个枚举,例如: public enum Resource { COAL, IRON } 那么稍后我想引用这样的内容: Amount[COAL] // The amount of coal Price[IRON] // The price of iron 我不想在Resource中设置Amount和Price字段,因为我想要一个按资源类型分组的对象(资源订单

我想引用枚举类型的数组。这是C++中的一个非常标准的东西(我的原点),但是我不确定java中是否有可能。 例如,我想要一个枚举,例如:

public enum Resource {
    COAL,
    IRON
}
那么稍后我想引用这样的内容:

Amount[COAL] // The amount of coal
Price[IRON]  // The price of iron
我不想在
Resource
中设置
Amount
Price
字段,因为我想要一个按资源类型分组的对象(资源订单)列表。手动将int分配给每种类型的
资源
并不比
公共静态int final废话好多少
我觉得什么也得不到


本质上,我在寻找C++标记的枚举。我意识到这可能是java中错误的做事方式,所以请随意给我指出正确的java精神的方向。C++中的< /P> < P> >,枚举实际上是整数的别名。在Java中,它们是“适当的”对象——这就是为什么不能将它们用作数组引用的原因

如果您想在数组中查找与特定枚举对象关联的值,我觉得这就像一个映射!用
EnumMap
替换这些数组怎么样


该类经过优化,可与枚举键一起使用,因此它最终会在幕后使用对枚举的序数(整数)值进行键控的数组。因此,它比通用hashmap快得多,而且您可以获得基于数组的解决方案的速度,它具有
映射的语义表达能力,这是两全其美。

不幸的是,您需要稍微长一点的语法:

Amount[COAL.ordinal()] // The amount of coal
Price[IRON.ordinal()]  // The price of iron
如果你不喜欢,常数可能是你唯一的选择

public class Resource {
    public static final int COAL = 0;
    public static final int IRON = 1;

}

希望有帮助。

你几乎可以做到。与C++相比, EnUM<代码>只是一个<代码> int >代码>,java的<代码>枚举< /Cord>是类。所以不能将其用作数组的索引。但是每个enum元素都有
ordinal()
,即int,因此可以这样说

amount[COAL.ordinal()]
price[IRON.ordinal()]
但你有更好的方法。可以将方法添加到枚举,因此其外观如下:

IRON.price(amounts)
COAL.amount(prices)

我认为这种方法更好。

我认为您正在寻找EnumMap

它不完全是一个数组,但因为键是一个枚举,所以它仍然节省空间

结果是:


amount.get(Resource.COAL)

每个Java枚举元素都有一个与其关联的序号,根据枚举中的定义顺序从零开始索引。只要使用例如

COAL.ordinal()
但是,在我看来,您最好创建一个类,例如带有金额和价格字段的Order,然后保留这些字段的集合,例如在由枚举元素索引的映射中

e、 g

Map orders=newhashmap();
下单(资源、煤炭、新订单(价格、金额));

地图非常适合用于更动态的数据。但是您还必须编写所有检查双名称、双值、现有名称/值以及所有内容的代码。即使在这种情况下,如果您执行了错误,也只能在运行时找到它

要获得更多静态数据,最好不要使用基本枚举,而是使用。他们太棒了!编译器将发现错误

public enum Resource{
    COAL(0), IRON(1);
    int index;
    private Resource(int index){
        this.index=index;
    }
}
...
amount[Resource.COAL.index]=...
但更好的变体是:

public enum Resource{
    COAL(538,0.5f), IRON(115,1.5f);
    int amount;
    float price;
    private Resource(int amount, float price ){
        this.amount=amount;
        this.price=price;
    }
}
...
Resource.COAL.amount=...
你可以用他们的名字

您可以通过所有枚举进行循环:

for(Resource resourceType: Resource.values()) { 
   String toOutput=resourceType.name()+" amount="+ resourceType.amount;
}

啊!这正是我想要的,非常感谢!您确实不应该使用
ordinal()
-如果要在
枚举中添加另一个字段,或者甚至按字母顺序对其重新排序,您的代码将中断,并且几乎无法找出原因。
Map
是一个更优雅、更像Java的解决方案。。。但它回答了Cramer提出的问题。它(有点)回答了,但它也是“Java中‘错误’的做事方式”。
for(Resource resourceType: Resource.values()) { 
   String toOutput=resourceType.name()+" amount="+ resourceType.amount;
}