【问题标题】:Can I Map Enum Keys to Enum Values?我可以将枚举键映射到枚举值吗?
【发布时间】:2013-05-20 22:01:55
【问题描述】:

我有 2 个枚举(模块、UniqueChars)

模块有所有的键

UniqueChars 包含所有值。

如何使用 HashMap 或 EnumMap 映射这些?

首先,是否可以从 2 个单独的枚举中读取键和值??

public enum modules {
    MODULE("MTREE, VTL_POOL, VTL_ACCESS, SNAPSHOT, NFS_EXPORT, CIFS_SHARE, REPORTS, LOCAL_USERS ");

    private String validModules;

    private modules(String validModules) {
        this.validModules= validModules;
    }
}

public enum UniqueChars {
    LOWER_CASE_LETTERS("abcdefghijklmnopqrstuvwxyz"), 
    UPPER_CASE_LETTERS("ABCDEFGHIJKLMNOPQRSTUVWXYZ"), 
    NUMBERS("0123456789"), 
    PUNCTUATION(".-_"), 
    MTREE("*/:<>?\\|"), 
    VTL_POOL("*'?:/\\,"), 
    VTL_ACCESS("*'?:/\\,"),
    SNAPSHOT("`~!@#$%^&*()_+-={}|[]\\:\";'<>?,.'"),
    NFS_EXPORT("_-"),
    CIFS_SHARE("\\/:*?\"<>|+[];,="),
    REPORTS("`~!@#$%^&*()_+-={}|[]\\:\";'<>?,.'"),
    LOCAL_USERS("._-");

    private String validChars;

    private UniqueChars(String validChars) {
        this.validChars = validChars;
    }


    public String getValidChars() {
        return validChars;
    }

    public static String getValidCharStrings(UniqueChars... uniqueChars) {
        StringBuilder validCharsSB = new StringBuilder();
        for (UniqueChars chars : uniqueChars) {
            validCharsSB.append(chars.getValidChars());
        }
        return validCharsSB.toString();
    }
}

【问题讨论】:

  • 您的“模块”枚举(应该重命名为“模块”)已损坏,因为它只有一个成员,没有公共方法。它有什么用?接下来,您到底想达到什么目的?请更详细地解释您的最终目标以及您发布的代码应该做什么和不应该做什么。
  • 我想做 map.put(Module.Mtree, UniqueChars.getValidCharStrings(UniqueChars.MTree)) ... 以同样的方式我想将 Module 枚举中的所有模块映射到它们对应的值在 UniqueChars 枚举中。目前我只有一个枚举 UniqueChars,我正在使用开关盒进行映射。我想使用 2 个枚举并循环 map.put 语句。

标签: java enum-map


【解决方案1】:

是的:

import java.util.*;
enum color {
    r,g,b
}
enum letter {
    a,b,c
}
public class So16659089 {
    public static void main(String[] args) {
        System.out.println(map);
        System.out.println(map2);
    }
    static Map<color,letter> map=new EnumMap<color,letter>(color.class);
    static { // one way
        map.put(color.r,letter.a);
        map.put(color.g,letter.b);
        map.put(color.b,letter.c);
    }
    static Map<color,letter> map2=new EnumMap<color,letter>(color.class);
    static letter[] letters=new letter[]{letter.a,letter.b,letter.c};
    static { // another way
        for(int i=0;i<color.values().length;i++)
            map2.put(color.values()[i],letters[i]);
    }
}

【讨论】:

  • 如果我有 10 个颜色和字母的枚举常量,我需要编写 10 个 map.put 语句还是可以循环它们。如果我可以循环它们,该怎么做?谢谢
  • @VarunMukka 您可以遍历枚举调用的值(例如)modules.values()。这将返回一个包含所有 modules 声明值的数组。
【解决方案2】:

我在 API 中使用上面发布的代码。我想用 HashMap 或 EnumMap 替换 switch 块。不想对 'n' 个案例使用 'n' put 语句。

public String getUniqueString(int charCount, boolean validSpecialChar, UniqueChars 模块, boolean invalidSpecialChar, String... specialChars) {

    final int STRING_LENGTH = this.getRandomNumber(charCount);
    String finalString = "";
    String validCharStrings = "";

    if(!validSpecialChar){
        validCharStrings = UniqueChars.getValidCharStrings(
                UniqueChars.LOWER_CASE_LETTERS,
                UniqueChars.UPPER_CASE_LETTERS, UniqueChars.NUMBERS);
    } else {
        UniqueChars moduleName = null;
        switch (module) {
        case MTREE:
            moduleName = UniqueChars.MTREE;
            break;
        case VTL_POOL:
            moduleName = UniqueChars.VTL_POOL;
            break;
        case VTL_ACCESS:
            moduleName = UniqueChars.VTL_ACCESS;
            break;
        case SNAPSHOT:
            moduleName = UniqueChars.SNAPSHOT;
            break;
        case NFS_EXPORT:
            moduleName = UniqueChars.NFS_EXPORT;
            break;
        case CIFS_SHARE:
            moduleName = UniqueChars.CIFS_SHARE;
            break;
        case REPORTS:
            moduleName = UniqueChars.REPORTS;
            break;
        case LOCAL_USERS:
            moduleName = UniqueChars.LOCAL_USERS;
            break;
        }

        // If specialChar is true, special characters are included for the
        // specified module
        validCharStrings = UniqueChars.getValidCharStrings(
                UniqueChars.LOWER_CASE_LETTERS,
                UniqueChars.UPPER_CASE_LETTERS, UniqueChars.NUMBERS,
                moduleName);
    }

【讨论】:

  • 您应该使用这些额外信息更新您的问题,而不是将其添加为答案。您会很容易在问题下方发现一个编辑按钮。
猜你喜欢
  • 1970-01-01
  • 2019-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多