1. Java / Говнокод #8706

    +86

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    public void type(char character) {
        	switch (character) {
        	case 'a': doType(VK_A); break;
        	case 'b': doType(VK_B); break;
        	case 'c': doType(VK_C); break;
        	case 'd': doType(VK_D); break;
        	case 'e': doType(VK_E); break;
        	case 'f': doType(VK_F); break;
        	case 'g': doType(VK_G); break;
        	case 'h': doType(VK_H); break;
        	case 'i': doType(VK_I); break;
        	case 'j': doType(VK_J); break;
        	case 'k': doType(VK_K); break;
        	case 'l': doType(VK_L); break;
        	case 'm': doType(VK_M); break;
        	case 'n': doType(VK_N); break;
        	case 'o': doType(VK_O); break;
        	case 'p': doType(VK_P); break;
        	case 'q': doType(VK_Q); break;
        	case 'r': doType(VK_R); break;
        	case 's': doType(VK_S); break;
        	case 't': doType(VK_T); break;
        	case 'u': doType(VK_U); break;
        	case 'v': doType(VK_V); break;
        	case 'w': doType(VK_W); break;
        	case 'x': doType(VK_X); break;
        	case 'y': doType(VK_Y); break;
        	case 'z': doType(VK_Z); break;
        	case 'A': doType(VK_SHIFT, VK_A); break;
        	case 'B': doType(VK_SHIFT, VK_B); break;
        	case 'C': doType(VK_SHIFT, VK_C); break;
        	case 'D': doType(VK_SHIFT, VK_D); break;
        	case 'E': doType(VK_SHIFT, VK_E); break;
    <...>
        	case '$': doType(VK_DOLLAR); break;
        	case '%': doType(VK_SHIFT, VK_5); break;
        	case '^': doType(VK_CIRCUMFLEX); break;
        	case '&': doType(VK_AMPERSAND); break;
        	case '*': doType(VK_ASTERISK); break;
        	case '(': doType(VK_LEFT_PARENTHESIS); break;
        	case ')': doType(VK_RIGHT_PARENTHESIS); break;
        	case '_': doType(VK_UNDERSCORE); break;
        	case '+': doType(VK_PLUS); break;
        	case '\t': doType(VK_TAB); break;
        	case '\n': doType(VK_ENTER); break;
        	case '[': doType(VK_OPEN_BRACKET); break;
        	case ']': doType(VK_CLOSE_BRACKET); break;
        	case '\\': doType(VK_BACK_SLASH); break;
        	case '{': doType(VK_SHIFT, VK_OPEN_BRACKET); break;
        	case '}': doType(VK_SHIFT, VK_CLOSE_BRACKET); break;
        	case '|': doType(VK_SHIFT, VK_BACK_SLASH); break;
        	case ';': doType(VK_SEMICOLON); break;
        	case ':': doType(VK_COLON); break;
        	case '\'': doType(VK_QUOTE); break;
        	case '"': doType(VK_QUOTEDBL); break;
        	case ',': doType(VK_COMMA); break;
        	case '<': doType(VK_LESS); break;
        	case '.': doType(VK_PERIOD); break;
        	case '>': doType(VK_GREATER); break;
        	case '/': doType(VK_SLASH); break;
        	case '?': doType(VK_SHIFT, VK_SLASH); break;
        	case ' ': doType(VK_SPACE); break;
        	default:

    http://stackoverflow.com/questions/1248510/convert-string-to-keyevents
    Конвертируем символы в клавиши.
    Боян, да. Но теперь на джаве. Кстати, автор забыл про toLower и toUpper.

    Запостил: RaZeR, 01 Декабря 2011

    Комментарии (13) RSS

    • свой вариант в студию!
      Ответить
      • TreeMap
        Ответить
        • меня интересует именно код. в первую очередь интересуют его объем и аргументация чем он лучше предложенного.
          Ответить
          • лучше хотя бы тем, что поиск будет бинарный
            Ответить
            • так вроде switch значительно шустрее, чем простой перебор. А в TreeMap ещё и оверхед будет. HashMap лучше подходит, тут отличная естественная функция хэширования :)
              Потенциальный плюс: можно частично автоматизировать рефлексией добавление в мапу, но тут надо немножко подумать. А вообще тут вроде как гавно в самой java.
              Ответить
              • вот и я примерно о том же. Код достаточно усложнится, в том числе и для понимания, а что станет намного короче - далеко не факт.
                Ответить
              • Ну проверьте что быстрее) В зависимости от размеров, switch тоже может не супер быстро работать. Все зависит от того, как соптимизирует компилятор. Если будет кусками отсекать, то быстро, а если по 1 элементу, то обычный линейный перебор.
                Ответить
              • >А вообще тут вроде как гавно в самой java.
                Плюсую, но как можно было исправить java, чтобы это говно убрать? Но нужно признать, что оптимизирующий компилятор может превратить этот свитч в одно обращение к массиву. Так что, если компилятор хороший и включены соответствующие оптимизации, то это самый быстрый способ. (Ну разве что можно самому массив смастерить, но это не удобно. Такое лучше генератором кода делать).
                Ответить
              • показать все, что скрытоСледует заметить, что здесь в блоке <...> пропущено 'F'..'Z' и '0'..'9'. Так что код выше намного больше.

                Тк, тип VK_* не указан - будем считать что это enum. В крайнем случае константы #define VK_* можно переписать на энум и это будет более правильно.

                И так мой код, хотя форматирование не очень:
                #define _(c,vk) {c,[](){doType(VK::vk);}}
                #define __(c,vk1,vk2) {c,[](){doType(VK::vk1, VK::vk2);}}
                 
                unordered_map<char, function<void()>> cf=
                {
                _('$', DOLLAR), __('%', SHIFT, _5), _('^', CIRCUMFLEX), _('&', AMPERSAND), _('*', ASTERISK),
                _('(', LEFT_PARENTHESIS), _(')', RIGHT_PARENTHESIS), _('_', UNDERSCORE), _('+', PLUS),
                _('\t', TAB), _('\n', ENTER), _('[', OPEN_BRACKET), _(']', CLOSE_BRACKET), _('\\', BACK_SLASH),
                __('{', SHIFT, OPEN_BRACKET), __('}', SHIFT, CLOSE_BRACKET), __('|', SHIFT, BACK_SLASH),
                _(';', SEMICOLON), _(':', COLON), _('\'', QUOTE), _('"', QUOTEDBL), _(',', COMMA),
                _('<', LESS), _('.', PERIOD),  _('>', GREATER), _('/', SLASH),
                __('?', SHIFT, SLASH), _(' ', SPACE)
                };
                 
                #undef _
                #undef __
                 
                void addToCF(char keyBegin, char keyEnd, VK::_ valueBegin, VK::_ valueEnd, bool withShift)
                {
                  int value=valueBegin;
                  assert(keyEnd-keyBegin==valueEnd-valueBegin);
                  for(char key=keyBegin; key<keyEnd; ++key,  ++value)
                        cf[key]=[=](){withShift?doType(VK::SHIFT, (VK::_)value):doType((VK::_)value);};
                  assert(value==valueEnd);
                }
                 
                int main() {
                        addToCF('0', '9', VK::_0, VK::_9, false);
                        addToCF('a', 'z', VK::A, VK::Z, false);
                        addToCF('A', 'Z', VK::A, VK::Z, true);
                //Используем так:
                        cf['Z']();
                };


                http://ideone.com/Titav


                Кто сможет написать короче меня этот код на любом языке? Это не под силу никому. Я самый крутой.
                Хотя у PHP с рефлексией и eval больше шансов, чем у меня.
                Ответить
                • Всё понятно, но форматирование и любовь к _ вас погубит.
                  Это самый короткий вариант, но платформозависмый.
                  Ответить
                • круто, чё
                  Ответить
      • Вся соль в том, что VK_x - это целочисленные константы, которые идут в порядке A-Z, емнип. Вообще, надо проверять на нужность нажатия шифта через isUpperCase, а соотв. константы клавиш подбирать с некоторым оффсетом относительно кода символа (надо по значениям посмотреть, где начинается, скажем, символ "А" в дефолтной кодировке и какой кейкод VK_A). Вроде бы так.
        Ответить
    • показать все, что скрытоvanished
      Ответить

    Добавить комментарий