27.01.2015 / 23:53 | |
Naik Пользователь Сейчас: Offline
Имя: %name% Регистрация: 14.03.2010
| DominaN, if (!keyPressed(key)) keychain.add(key);
Можно использовать Set, тогда одинаковые объекты не будут записываться и можно убрать проверку
|
27.01.2015 / 23:56 | |
Kalter Пользователь Сейчас: Offline
Имя: Гриб Откуда: Оренбург - Нежинка Регистрация: 16.10.2013
| Naik, а что, можно два раза нажать на кнопку за раз?
__________________
Homo homini penis est. |
27.01.2015 / 23:59 | |
aNNiMON Супервизор Сейчас: Offline
Имя: Витёк Регистрация: 11.01.2010
| Naik, вот именно, Map, Set, но уж никак не List, имхо. Ибо гонять туда-сюда массив у ArrayList нехорошо.
__________________
let live Изменено aNNiMON (28.01 / 00:00) (всего 1 раз) |
28.01.2015 / 00:09 | |
Naik Пользователь Сейчас: Offline
Имя: %name% Регистрация: 14.03.2010
| Kalter, Можно 2 раза вызвать pressKey
|
28.01.2015 / 00:13 | |
DominaN Пользователь Сейчас: Offline
Имя: Кирилл Откуда: Смоленск Регистрация: 28.09.2011
| aNNiMON, окай private static final HashSet<Integer> keychain = new HashSet<>(1); //Pressed buttons will be stored here.
public static boolean keyPressed(int key) {
if (key == AFTControllable.KEY_ANY) return !keychain.isEmpty();
return (keychain.contains(key));
}
public static void pressKey(int key) {
keychain.add(key);
}
public static void resetKey(int key) {
keychain.remove(key);
}
public static void resetKeys() {
keychain.clear();
}
|
28.01.2015 / 00:17 | |
DominaN Пользователь Сейчас: Offline
Имя: Кирилл Откуда: Смоленск Регистрация: 28.09.2011
| Но вообще-то HashSet основан на HashMap, а значит, имхо, особого прироста производительности не будет
|
28.01.2015 / 00:53 | |
aNNiMON Супервизор Сейчас: Offline
Имя: Витёк Регистрация: 11.01.2010
| 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 Пользователь Сейчас: Offline
Имя: Кирилл Откуда: Смоленск Регистрация: 28.09.2011
| aNNiMON, В условиях максимум ну пяти элементов на скорости это вообще никак не сказывается, зато гораздо удобнее, позволяет граббить любые нажатые клавиши и жрет в два раза меньше памяти, ибо Boolean это уже не просто четыре байта, а полноценный объект |
28.01.2015 / 01:10 | |
DominaN Пользователь Сейчас: Offline
Имя: Кирилл Откуда: Смоленск Регистрация: 28.09.2011
| aNNiMON, И не забывай, что в твоем варианте вместо простого поиска наличия ключа в keyset мы еще вынуждены проверять состояние value, причем опять же - или конвертить Boolean в примитив, или производить сравнение с другим объектом (Boolean b.equals(Boolean.TRUE)) Изменено DominaN (28.01 / 01:12) (всего 3 раза) |
28.01.2015 / 01:20 | |
aNNiMON Супервизор Сейчас: Offline
Имя: Витёк Регистрация: 11.01.2010
| DominaN, У тебя на remove уйдёт больше времени, чем у меня на автобоксинг и сравнение value.
Кстати, видел, в играх такое используют: boolean[] state = new boolean[600]; А потом сразу по коду клавиши проверяют состояние. Так быстро, но в памяти проигрыш.
__________________
let live |