数组的替代方案之枚举作为索引?

6

我曾经在C语言中使用枚举作为索引。(每个枚举都类似于int值的别名)例如:

typedef enum {DOG, CAT, MOUSE} ANIMALS;
int[3] age;
...
age[DOG] = 4;
age[CAT] = 3;
age[MOUSE] = 10;

利用枚举作为索引,我能够始终确保更新正确的单元格。此外,我也需要数组的简洁性。

我想在Java中做同样的事情。但是,我似乎找不到一个简单的替代品。 有人知道是否有可以像C语言中的Array + enum组合一样使用的替代品吗?


为什么要使用MapList - user1907906
你需要展示一个小例子,说明你想要实现什么以及在哪里和如何使用枚举。因此,对于那些对C语言知之甚少或者根本不了解的Java开发人员来说,你的问题并没有太多意义。 - Rahul
我认为这种情况不存在。但是如果存在的话,那应该是一种不好的编程实践,要记住Java是面向对象的语言。同时请注意,在C语言中这也不是一个好的实践(你应该考虑数据类型抽象)。除非你想做类似键值对的事情,在这种情况下你可以使用Map。 - Luis Alves
感谢您的有益评论,我会进一步阅读关于地图等方面的资料,以确定它是否符合我的需求。 - coffeenet
4个回答

6

是的,有一个相当简单的方法。使用 HashMaps

Map<CustomEnum, Object> hashMap = new HashMap<>();

//Basic usage
hashMap.put(CustomEnumID, ObjectValue);
ObjectValue obj = hashMap.get(CustumEnumID); //Returns the value from the above line
hashMap.containsValue(CustomEnumID); //Return true or false

谢谢您提供详细的答案。让我先仔细阅读,然后再重新评论。但是为了确保,您的意思是CustomEnumID将是我创建的自定义枚举,并且它将像您上面友好地指导的那样充当我的索引吗? - coffeenet
由于缺乏更好的通用术语,我使用了“CustomEnumID”。但是,是的,“CustumEnumID”将是一个自定义枚举类。 - DonyorM
谢谢你的回答。我测试了一下,它有效 : ) 我开始喜欢这个网站了 : p - coffeenet
没问题,是啊我也喜欢这个网站! - DonyorM

1

正如其他答案中已经提到的那样,使用Map<YourEnum, V>是实现你想要的功能的好方法。然而,Java实际上有一个EnumMap(它实现了常规的Map接口),专门设计用于枚举类型键的使用,并且根据文档所说,它很可能比使用HashMap更快。


1

Enum 在 Java 中基本上就是对象。因此,如果您想在代码中引入对象-对象关系,可以选择使用 HashMap


0
在我看来,有两种解决方案:
1)您可以通过Java中的类模拟“C枚举类型”:
class Animals {
    public static int DOG = 0;
    public static int CAT = 1;
    public static int MOUSE = 2;
}

在这种情况下,您需要手动为枚举设置值 - 在 C 中,编译器会自动完成此操作。
枚举的使用方式如下:
public class Test {
  public static void main(String[] args) {

    int[] age = new int[3];

    age[Animals.DOG] = 4;
    age[Animals.CAT] = 3;
    age[Animals.MOUSE] = 10;

    for (int i = 0; i < age.length; i++) {
        System.out.print(age[i] + " ");
    }
  }
}

我认为这是一个不好的解决方案,因为它违反了面向对象编程原则中的封装性(在Animals类中)。

2)您可以使用Java枚举。

enum Animals {
    DOG(0), CAT(1), MOUSE(2);
    int value;

    private Animals(int value) {
        this.value = value;
    }

    public int getValue() {
        return this.value;
    }
}

使用示例

public class Test {
    public static void main(String[] args) {

        int[] age = new int[3];

        age[Animals.DOG.getValue()] = 4;
        age[Animals.CAT.getValue()] = 3;
        age[Animals.MOUSE.getValue()] = 10;

        for (int i = 0; i < age.length; i++) {
            System.out.print(age[i] + " ");
        }
    }
}

在Java中,枚举是一种类。要了解更多细节,请阅读this。 枚举没有默认值,您必须自己设置。在此示例中,使用构造函数Animal(int value)完成。此外,我们不能像整数值一样使用Animals.DOG,而必须使用方法getValue()


谢谢您提供详细的答案!但是,我决定选择DonyorM友好提供的选项。 - coffeenet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接