採用 hook 的方式如何?
如果範圍沒有太大那就直接用繼承
如果萬一怕會變動太大那就用橋接
我這裡用繼承
以下我是只判別是否為連續
public class MyHashtable extends Hashtable{
Map<Object,Integer> _count = new HashMap();
//這裡要改寫!!!
boolean checkequal(Object v1,Object v2){
return v1.equals(v2);
}
boolean count(Object key, Object value){
//1.String key = String.format("%s.%s", _key,value);
//2.
if( this.containsKey(key)==false
|| checkequal(this.get(key),value) ==false
){
_count.put(key, 0);
}
//count
//_count.put(key, _count.containsKey(key) ? _count.get(key) + 1 : 1) ;
_count.put(key, _count.get(key) + 1);
System.out.printf("%s:%s\n",key,_count.get(key));
//trigger 這邊可以決定要不要採用listener模式
if(_count.get(key) == 10){
//do something
//return false?
//clean ?
//_count.remove(key);
}
return true;
}
@Override
public synchronized Object put(Object key, Object value) {
//這邊要自己決定hook的先後順序,並且決定是否中斷?
//before or after ?
boolean ck = count( key, value) ;
//if stop
//if(ck == false){return:}
return super.put(key, value);
}
}
※ 引述《freedom74569 (莫急莫慌莫害怕)》之銘言:
: 發出求救信號~
: 我有一個Hashtable<Key,Values>
: 裡面的Values一直更新
: 想要判斷Values連續10次相同就remove掉這個device的array
: 我有寫出大概意思的code不過不知道怎麼下手,因我的mRssi會一直更新
: public ArrayList<BluetoothDevice> mLeDevices = new ArrayList<BluetoothDevice>();
: public ArrayList<byte[]> mRecords = new ArrayList<byte[]>();
: public Hashtable<String, Integer> mRssi = new Hashtable<>();
: public void addDevice(BluetoothDevice device, int rssi, byte[] scanRecord) {
: if (!mLeDevices.contains(device)) {
: mLeDevices.add(device);
: mRecords.add(scanRecord);
: }
: mRssi.put(device.getAddress(), rssi);
: /** 以下為意識code */
: ArrayList<Integer> rssiArrayList = new ArrayList<Integer>(mRssi.values());
: int lastNum = rssiArrayList.get();
: int count = 0;
: /** 從頭開始loop */
: for (int i = 0; i < rssiArrayList.size(); i++) {
: /** 如果當前值等於最後值 */
: if(rssiArrayList[i]==lastNum){
: count++;
: if(count>=10){
: /** 如果連續10次rssi相同就移除 */
: mLeDevices.remove();
: }
: }
: /** 如果不相等的話 */
: else {
: lastNum=rssiArrayList[i];
: count = 1;
: }
: }
: Log.e("mRssi", String.valueOf(mRssi));
: }