0

個人的な興味から、特殊文字をエスケープするさまざまな方法をベンチマークしています。

同僚は、マップ内に文字が含まれているかどうかを確認するために、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

4

1 に答える 1

2

EscapeChars最初に に変換する必要があるMapため、検索用にを使用する必要があるとは思いません。あなたの使用法を考慮して、このマップでaMap<Integer, EscapeChars>と を使用することをお勧めします。containsKey

于 2013-09-23T13:48:36.743 に答える