EnumMap-用于检测转义字符

时间:2013-09-23 13:44:07

标签: java escaping enum-map

出于个人兴趣,我是替补标记各种逃避特殊角色的方法。

一位同事建议,为了检查地图中是否包含某个字符,EnumMap也可能很快。

我正在尝试以下代码,它使用containsValue();

但是,是否可以使用containsKey();

public static enum EscapeChars {
        COLON(':'), SLASH('\\'), QUESTION('?'), PLUS('+'), MINUS('-'), EXCLAMATION(
                '!'), LEFT_PARENTHESIS('('), RIGHT_PARENTHESIS(')'), LEFT_CURLY(
                '{'), RIGHT_CURLY('}'), LEFT_SQUARE('['), RIGHT_SQUARE(']'), UP(
                '^'), QUOTE('"'), TILD('~'), ASTERISK('*'),  PIPE('|'),  AMPERSEND('&');

        private final char character;

        EscapeChars(char character) {
            this.character = character;
        }

        public char getCharacter() {
            return character;
        }
    }

    static EnumMap<EscapeChars, Integer> EnumMap = new EnumMap<EscapeChars,Integer>(
            EscapeChars.class);

    static {
        for (EscapeChars ec : EscapeChars.values()) {
        EnumMap.put(ec, (int)ec.character);
        }       
    }

        static void method5_Enum() {

        String query2="";

        for (int j = 0; j < TEST_TIMES; j++) {
            query2 = query;
            char[] queryCharArray = new char[query.length() * 2];
            char c;
            int length = query.length();
            int currentIndex = 0;
            for (int i = 0; i < length; i++) {
                c = query.charAt(i);
                if (EnumMap.containsValue((int)c)) {
                    if ('&' == c || '|' == c) {
                        if (i + 1 < length && query.charAt(i + 1) == c) {
                            queryCharArray[currentIndex++] = '\\';
                            queryCharArray[currentIndex++] = c;
                            queryCharArray[currentIndex++] = c;
                            i++;
                        }
                    } else {
                        queryCharArray[currentIndex++] = '\\';
                        queryCharArray[currentIndex++] = c;
                    }
                } else {
                    queryCharArray[currentIndex++] = c;
                }
            }

            query2 = new String(queryCharArray, 0, currentIndex);
        }


        System.out.println(query2);

    }

参考:https://softwareengineering.stackexchange.com/questions/212254/optimized-special-character-escaper-vs-matcher-pattern

1 个答案:

答案 0 :(得分:2)

我不相信你会想要,因为你首先必须转换为EscapeChars,这是查找Map的重点。我建议根据您的使用情况,我会使用Map<Integer, EscapeChars>并在此地图上使用containsKey