2012-03-19 290 views
1

鉴于此枚举:Java的匹配字符串值,枚举,有多个字符串匹配的可能性每个枚举值

public enum FileTypes { 
     FILEA, FILEB, FILEC; 
    } 

说你想看看一个字符串值相匹配的3种枚举类型中的一种,我有这个方法:

public static boolean validFileType(String value) { 
    for (FileTypes fileTypes : FileTypes.values()) { 
     if (fileTypes.name().equals(value)) { 
      return true; 
     } 
    } 
    return false; 
} 

这很好,现在我想改变一下。我可以添加多个字符串以匹配单个枚举吗?假设字符串值是“FILEA”或“example-file”,我可以同时拥有枚举中指定的那些值吗?我希望将这些枚举保留在枚举中,而不是在枚举之外执行映射。

希望是有道理的,感谢您的任何想法

+0

不知道我得到的问题。如果您要将示例文件添加到枚举中,那是行不通的吗? – 2012-03-19 15:00:38

回答

0

Map<String, FileTypes> map = new HashMap<>(); 
map.put("FILEA", FileTypes.FILEA); 
map.put("example-file", FileTypes.FILEA); 

boolean validFileType(String value) { 
    return map.containsKey(value); 
} 

你的想法...如果你想仔细夫妇有效的“价值”与他们的枚举,您可以创建枚举像这样:

public enum FileTypes { 
    FILEA("FILEA", "example-file"), 
    FILEB("FILEB"), 
    FILEC("FILEC"); 

    private final List<String> values; 

    private FileTypes(String... values) { 
     this.values = Arrays.asList(values); 
    } 

    public boolean validFileType(String value) { 
     return values.contains(value); 
    } 
} 
0
public enum FileTypes { 
    FILEA(Arrays.asList("fileA", "the first one")), 
    FILEB(Arrays.asList("fileB")), 
    FILEC(Arrays.asList("fileC")); 

    private final Collection<String> val; 

    private FileTypes(Collection<String> val) { 
    this.val = val; 
    } 

    public static FileTypes findByValue(String val) { 
    for (FileTypes ft : values()) { 
     if (ft.val.contains(val)) { 
     return ft; 
     } 
    } 
    throw new IllegalArgumentException("There's no such file type identified by " + val); 
    } 
} 

FILEA可发现无论是fileAthe first one

System.out.println("file a: " + FileTypes.findByValue("fileA")); 
System.out.println("file a: " + FileTypes.findByValue("the first one")); 
2

您可以在有效的条目添加到您的枚举的构造是这样的:

public enum FileTypes { 

    FILEA("example_file"), //2 valid types 
    FILEB("example2", "example3"), //3 valid types 
    FILEC(); //Only "FILEC" is valid 

    FileTypes(String... otherValidEntries) { 
     this.validEntries.add(this.toString()); //I assume that the name of the enum is valid 
     this.validEntries.addAll(Arrays.asList(otherValidEntries)); 
    } 
    private List<String> validEntries = new ArrayList<String>(); 

    public static boolean isValidFileType(String value) { 
     for (FileTypes fileTypes : FileTypes.values()) { 
      if (fileTypes.validEntries.contains(value)) { 
       return true; 
      } 
     } 
     return false; 
    } 
} 

使用例:

public static void main(String[] args) { 
    System.out.println(FileTypes.isValidFileType("FILEA")); //true 
    System.out.println(FileTypes.isValidFileType("FILEB")); //true 
    System.out.println(FileTypes.isValidFileType("example2")); //true 
    System.out.println(FileTypes.isValidFileType("example3")); //true 
    System.out.println(FileTypes.isValidFileType("FILEC")); //true 
    System.out.println(FileTypes.isValidFileType("example4")); //false 
} 
0

您可以将字段添加到枚举:

public enum FileTypes 
{ 
    FILEA("FILEA"), FILEB("FILEB", "file_b"), FILEC("FILEC", "file_c", "File of type C", "C_FILE"); 

    private String[] aliases; 

    private FileTypes(String... aliases){ 
     this.aliases = aliases; 
    } 

    public boolean equals(String string){ 
     for(int i = 0; i < aliases.length; i++){ 
      if(aliases[i].equals(string)){ 
       return true; 
      } 
     } 
     return false; 
    } 
} 

然后:

public static boolean validFileType(String value) { 
    for (FileTypes fileType : FileTypes.values()) { 
     if (fileTypes.equals(value)) { 
      return true; 
     } 
    } 
    return false; 
}