【问题标题】:Enumeration lookup in JavaJava中的枚举查找
【发布时间】:2012-03-15 05:38:56
【问题描述】:

我对 Java 不太熟悉,在枚举查找方面需要一些帮助(我认为这就是所谓的?)我有多年的 C 经验,所以我知道我想用 C 来完成什么,但是我不知道 Java 中的等效语法或构造。

我在这台计算机上没有 C 环境,因此语法可能不正确,但这是我想要完成的:

typedef enum regions_t {
     REGION_CALIFORNIA,
     REGION_HAWAII,
     REGION_LOUISIANA,
     REGION_NUM_REGIONS
} regions_t;

typedef struct regionData_t {
    regions_t regionName;
    char_t[50] url;
    int32_t population;
 } regionData_t;

 regionData_t myRegions[REGION_NUM_REGIONS] {
     {REGION_CALIFORNIA, "http://http://california.gov/", 10123321},
     {REGION_HAWAII, "http://hawaii.gov", 5123321},
     {REGION_LOUISIANA, "http://louisiana.gov/", 8123321}
 }

这样,我可以通过这种方式访问​​例如 url 数据,这种方式易于阅读和扩展:

myRegions[REGION_HAWAII].url

我如何在 Java 中实现同样的想法?

【问题讨论】:

    标签: java enums lookup


    【解决方案1】:

    我怀疑你需要这样的东西:

    public enum Region {
        CALIFORNIA("california-url", 1),
        HAWAII("hawaii-url", 2),
        LOUISIANA("louisiana-url", 3);
    
        private String url;
        private int population;
    
        private Region(String url, int population) {
            this.url = url;
            this.population = population;
        }
    
        public int getPopulation() {
            return population;
        }
    
        public String url() {
            return url;
        }
    }
    

    请注意,字符串 url 应该可能来自外部资源。

    【讨论】:

    • 注意,在 Java 中,枚举成员是对象,因此可以包含属性。也就是说,你可以说Region.CALIFORNIA.url()(甚至Region r = Region.CALIFORNIA; String url = r.url();,如果你使用这种方法,就不必有一个枚举到属性的映射。+1
    【解决方案2】:

    又快又脏:

    public enum Region {
        CALIFORNIA, HAWAII, LOUISIANA
    }
    
    public class RegionData {
        public final Region region;
        public final String url;
        public final int population;
        public RegionData(Region region, String url, int population) {
            this.region = region;
            this.url = url;
            this.popuplation = population;
        }
    }
    
    …
    
    Map<Region, RegionData> regionData = new HashMap<Region, RegionData>();
    regionData.put(Region.CALIFORNIA, new RegionData(Region.CALIFORNIA, "http://http://california.gov/", 10123321));
    …
    
    System.out.println(regionData.get(Region.CALIFORNIA).url);
    

    但您也可以使用 Java 中的枚举也是普通类这一事实。

    public enum Region {
        CALIFORNIA("http://http://california.gov/", 10123321),
        HAWAII("http://hawaii.gov", 5123321),
        LOUISIANA("http://louisiana.gov/", 8123321);
        public final String url;
        public final int population;
        private Region(String url, int population) {
            this.url = url;
            this.population;
        }
    }
    
    …
    
    System.out.println(Region.CALIFORNIA.url);
    

    【讨论】:

    • 接受,因为它复制了我最接近的功能。谢谢。
    • 在这种情况下,您应该使用 EnumMap 而不是 HashMap。
    【解决方案3】:

    Java 的枚举也有语法略有不同,但不是结构,您需要将所有这些信息封装在一个类中。我尽可能直接列出翻译:

    public enum Region
    {
        REGION_CALIFORNIA,
        REGION_HAWAII,
        REGION_LOUISIANA;
    }
    
    public class RegionData
    {
       Region region;
       String url;
       int    population;
    
       public RegionData(Region region, String url, int population)
       {
          this.region     = region;
          this.url        = url;
          this.population = population;
       }
    }
    

    然后你会想要查看 HashTable 类的 HashMap 以获得你想要的查找功能:

    http://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html

    http://docs.oracle.com/javase/7/docs/api/java/util/Hashtable.html

    【讨论】:

      【解决方案4】:

      Java 中的枚举实际上是类。所以你可以对它们做任何你喜欢的事情,除了一些事情,比如在运行时实例化对象。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-08
        • 1970-01-01
        • 2011-07-16
        • 2015-03-04
        • 2010-12-17
        • 2010-12-10
        相关资源
        最近更新 更多