在android中经常有在多少秒内点击某个按钮多少下的需求,之前在网上的博客找到的解决方法如下:
// 定义hit的长度,需要点击多少下就申明多长的数组,用于记录每次点击的时间戳。
mHits = new long[5];
System.arraycopy(mHits, 1, mHits, 0, mHits.length - 1); //把从第二位至最后一位之间的数字复制到第一位至倒数第一位,相当于不断丢弃第一位上的数字。
mHits[mHits.length - 1] = SystemClock.uptimeMillis(); // 记录一个时间,并加入到末尾。
if (SystemClock.uptimeMillis() - mHits[0] <= 5000) {
//5秒内连续点击。
}
由于数组在此功能中的作用相当于队列,受此启发,我们可以使用真正的队列来实现该功能。
// 申明队列(这个是双端队列)
// 由于经常要删除队头元素及添加队尾元素,故使用链表结构的队列。这样在增删时只会有O(1)的复杂度
Deque<Long> deque = new LinkedList<>();
deque.offerLast(System.currentTimeMillis());
if (deque.size() > 5) {
deque.pollFirst();
}
if (deque.size() == 5) {
long first = deque.peekFirst();
long last = deque.peekLast();
if (last - first <= 5000) {
Log.i("test", "test: you cilck home");
}
}
由于链表中会新增节点,在内存使用上该方式不如使用固定长度的数组,但通过基本数据结构来思考问题最后在优化也不失为一种解决方法。