2012-08-07 84 views
0

此代码有效,但使用try/catch box使用枚举集

public enum AccentuationUTF8 {/** */ 
     é, /** */è, /** */ç, /** */à, /** */ù, /** */ 
     ä, /** */ë, /** */ö, /** */ï, /** */ü, /** */ 
     â, /** */ê, /** */î, /** */ô, /** */û, /** */ 
} 
...... 

    final EnumSet<AccentuationUTF8> esUtf8 = EnumSet.noneOf(AccentuationUTF8.class); 
    final String[] acc1 = {"é", "à", "u"}; 
    for (final String string : acc1) { 
     try { // The ontologic problem 
      esUtf8.add(AccentuationUTF8.valueOf(string)); 
     } catch (final Exception e) { 
      System.out.println(string + " not an accent."); 
     } 
    } 
    System.out.println(esUtf8.size() + "\t" + esUtf8.toString() 

输出:

u not an accent. 
2 [é, à] 

我要生成一个词或句子的所有口音的EnumSet。评论后

编辑

  • 是否有可能来管理这样的EnumSet不使用try(由AccentuationUTF8.valueOf(string)
  • 是更好的方式来编写需要的?

最后编辑

您的回覆显示我的一个很好的解决方案:因为EnumSet.contains(Object),throw an Exception,改变它:创建一个临时的HashSet能够返回一个null没有例外。

所以丑陋try/catch现已删除,代码现在:对于关注你支付

final Set<String> setTmp = new HashSet<>(AccentsUTF8.values().length); 
for (final AccentsUTF8 object : AccentsUTF8.values()) { 
    setTmp.add(object.toString()); 
} 
final EnumSet<AccentsUTF8> esUtf8 = EnumSet.noneOf(AccentsUTF8.class); 
final String[] acc1 = {"é", "à", "u"}; 
for (final String string : acc1) { 
    if (setTmp.contains(string)) { 
     esUtf8.add(AccentsUTF8.valueOf(string)); 
    } else { 
     System.out.println(string + " not an accent."); 
    } 
} 
System.out.println(esUtf8.size() + "\t" + esUtf8.toString() 

感谢。

回答

2

我不认为枚举是这里最好的方法 - 部分原因是它只能用于有效的Java标识符。

它看起来像你真正想要的只是一个Set<Character>,喜欢的东西:

Set<Character> accentsInText = new HashSet<Character>(); 
for (int i = 0; i < text.length(); i++) { 
    Character c = text.charAt(i); 
    if (ALL_ACCENTS.contains(c)) { 
     accentsInText.add(c); 
    } 
} 
+2

+1为了简单起见,'accents'甚至可以了'String'这可能不是慢得多。 – 2012-08-07 10:11:09

+0

我已经想到了你的答案,但是我想用易于管理的EnumSet(以及由Sun/Oracle表示的速度)来强调查询单词 – 2012-08-07 10:12:27

+0

@ cl-r:你是否真的认为每个非用户都会遇到异常性格会给你速度?您的代码以何种方式比我的“更易于管理”? – 2012-08-07 10:16:17