Вниз  Java-программирование (1-ые посты)
- 27.01.2015 / 23:53
Naik
  Пользователь

Naik 
Сейчас: Offline
DominaN, if (!keyPressed(key)) keychain.add(key);

Можно использовать Set, тогда одинаковые объекты не будут записываться и можно убрать проверку
- 27.01.2015 / 23:56
Kalter
  Пользователь

Kalter 
Сейчас: Offline
Naik, а что, можно два раза нажать на кнопку за раз?
__________________
 Homo homini penis est.
- 27.01.2015 / 23:59
aNNiMON
  Супервизор

aNNiMON 
Сейчас: Offline
Naik, вот именно, Map, Set, но уж никак не List, имхо.
Ибо гонять туда-сюда массив у ArrayList нехорошо.
__________________
 let live

Изменено aNNiMON (28.01 / 00:00) (всего 1 раз)
- 28.01.2015 / 00:09
Naik
  Пользователь

Naik 
Сейчас: Offline
Kalter, Можно 2 раза вызвать pressKey
- 28.01.2015 / 00:13
DominaN
  Пользователь

DominaN 
Сейчас: Offline
aNNiMON, окай
  1. private static final HashSet<Integer> keychain = new HashSet<>(1); //Pressed buttons will be stored here.
  2.  
  3.     public static boolean keyPressed(int key) {
  4.         if (key == AFTControllable.KEY_ANY) return !keychain.isEmpty();
  5.         return (keychain.contains(key));
  6.     }
  7.  
  8.     public static void pressKey(int key) {
  9.         keychain.add(key);
  10.     }
  11.  
  12.     public static void resetKey(int key) {
  13.         keychain.remove(key);
  14.     }
  15.  
  16.     public static void resetKeys() {
  17.         keychain.clear();
  18.     }

- 28.01.2015 / 00:17
DominaN
  Пользователь

DominaN 
Сейчас: Offline
Но вообще-то HashSet основан на HashMap, а значит, имхо, особого прироста производительности не будет
- 28.01.2015 / 00:53
aNNiMON
  Супервизор

aNNiMON 
Сейчас: Offline
DominaN, Да как не будет-то, если получение и запись за O(1) выполняется?

Вот только с remove косяк - медленно. Я не так имел в виду.

HashMap<Integer, Boolean>.. Получаем по ключу состояние: true нажата, false нет. В итоге установка в состояние нажатия: O(1), в состояние отпущенной клавиши O(1), проверка нажата ли O(1). А удалять ключи не надо. Разве что в resetKeys.

А если на Android'e писать, то вообще класс, там есть обёртка под примитивные типы: SparseBooleanArray кажется так. Это будет ещё быстрее.
__________________
 let live

Изменено aNNiMON (28.01 / 00:54) (всего 2 раза)
- 28.01.2015 / 01:04
DominaN
  Пользователь

DominaN 
Сейчас: Offline
aNNiMON, В условиях максимум ну пяти элементов на скорости это вообще никак не сказывается, зато гораздо удобнее, позволяет граббить любые нажатые клавиши и жрет в два раза меньше памяти, ибо Boolean это уже не просто четыре байта, а полноценный объект ;-)
- 28.01.2015 / 01:10
DominaN
  Пользователь

DominaN 
Сейчас: Offline
aNNiMON, И не забывай, что в твоем варианте вместо простого поиска наличия ключа в keyset мы еще вынуждены проверять состояние value, причем опять же - или конвертить Boolean в примитив, или производить сравнение с другим объектом (Boolean b.equals(Boolean.TRUE)) :)

Изменено DominaN (28.01 / 01:12) (всего 3 раза)
- 28.01.2015 / 01:20
aNNiMON
  Супервизор

aNNiMON 
Сейчас: Offline
DominaN, У тебя на remove уйдёт больше времени, чем у меня на автобоксинг и сравнение value.

Кстати, видел, в играх такое используют:
boolean[] state = new boolean[600];
А потом сразу по коду клавиши проверяют состояние. Так быстро, но в памяти проигрыш.
__________________
 let live
Наверх  Всего сообщений: 16875
Фильтровать сообщения
Поиск по теме
Файлы топика (794)