最近帮师姐改安卓程序,中间一个模块要实现采集由按键控制的某段时间的ecg和ppg值;
数据源都已经弄好了,我的思路就是在每次循环中的sendmessage中用容器存储ecg和ppg 通过条件判断实现 start button 按下后 容器的存储,在stop按下后实现对容器元素提取到数组的处理,方便下一步对心电和脉搏数据的ppt算法实现(还未做);
更新:不能用无序的hashmap ,由于容器中的元素后续要加入数组中,所以需要更有序的treemap?
更新,我需要的是保证map的遍历顺序和put顺序一致,应该选用LinkedHashMap
private void sendmessage(String valueString) {
valueInt1 = (Integer.valueOf(valueString.substring(0, 4), 16) & 0xffff);
valueInt2 = (short) (Integer.valueOf(valueString.substring(4), 16) & 0xffff);
// EcgValue.put(cout, valueInt1);
// PpgValue.put(cout, valueInt2);
// cout++;
if (isWriteFile) {
Value myValue = new Value();
myValue.setEcg(valueInt1);
myValue.setPpg(valueInt2);
DataValue.put(index, myValue);
// EcgValue.put(index, valueInt1);
// PpgValue.put(index, valueInt2);
// ecg_ppg_value[0] = valueInt1;
// ecg_ppg_value[1] = valueInt2;
// Value.put(index, ecg_ppg_value);
index++;
write(System.currentTimeMillis() + " " + String.valueOf(valueInt1) + "\n", 0);//currentTimeMillis()输出的竟然是1970年1月1日到当前的毫秒数
write(System.currentTimeMillis() + " " + String.valueOf(valueInt2) + "\n", 1);
// Log.i("value", "ecg_ppg_value 0:" + Value.get(index-1) );
}
if ((!DataValue.isEmpty()) &&(!isWriteFile)) {
ecgvalue = new int [2][DataValue.size()];//数组初始化
ppgvalue = new int [2][DataValue.size()];//数组初始化
int i = 0;
Iterator iter = DataValue.entrySet().iterator();
while(iter.hasNext()){
HashMap.Entry<Integer, Value> entry = (Entry<Integer, Value>) iter.next();
ecgvalue[0][i] = entry.getKey();
ppgvalue[0][i] = entry.getKey();
ecgvalue[1][i] = entry.getValue().getEcg();
ppgvalue[1][i] = entry.getValue().getPpg();
i++;
Log.i("message", "i = " + i);
}
Log.i("message", String.valueOf(DataValue.size()));//
DataValue.clear();//
}
private HashMap<Integer, Integer[]> Value = new HashMap<Integer, Integer[]>();
在条件判别中:
ecg_ppg_value[0] = valueInt1;
ecg_ppg_value[1] = valueInt2;
Value.put(index, ecg_ppg_value);
index++;
在容器往数组转的语句中:
if ((!Value.isEmpty()) &&(!isWriteFile)) {
ecgvalue = new int [2][Value.size()];//数组初始化
ppgvalue = new int [2][Value.size()];//数组初始化
int i = 0;
Iterator iter = Value.entrySet().iterator();
while(iter.hasNext()){
HashMap.Entry<Integer, Integer[]> entry = (Entry<Integer, Integer[]>) iter.next();
ecgvalue[0][i] = entry.getKey();
ppgvalue[0][i] = entry.getKey();
ecgvalue[1][i] = entry.getValue()[0];
ppgvalue[1][i] = entry.getValue()[1];
i++;
Log.i("message", "i = " + i);
}
Log.i("message", String.valueOf(Value.size()));//
Value.clear();//
}
看起来很正常,结果在log ecgvalue[1][i] 后程序报错;但这个原因还需要分析
首先是错误的原因:
private HashMap<Integer, Integer[]> Value = new HashMap<Integer, Integer[]>();
这种写法只是把数组的引用 重复 赋值给了 不同key 对应的value ,而我把数组的初始化写给在了改方法外面,实际效果只是不断的在刷新数组的两个值,并把所有value数组的引用指向改值??但是为什么在log中会崩溃呢,难道是刷新后的value,以前的key对应的value的引用对象也变了?
后续:师姐把new移到if中后就ok了,但我写了个小测试程序,目前发现只会导致数组元素都指向最后一组值,但是log崩溃原因还是没找到。
package test;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map.Entry;
public class Test3 {
int[][] ecgvalue ;
public HashMap<Integer, Integer[]> value = new HashMap<Integer, Integer[]>();
Integer[] test = new Integer[2]; //
public static void main(String[] args) {
Test3 test3 = new Test3();
test3.Test();
}
public void Test() {
for (int i = 0; i < 10; i++) {
test[0] = i;
test[1] = i+10;
value.put(i, test);
}
System.out.println(value.get(1)[1] + " " + value.size());
ecgvalue = new int[2][value.size()];
int i = 0 ;
Iterator<Entry<Integer,Integer[]>> iterator = value.entrySet().iterator();
while(iterator.hasNext()){
HashMap.Entry<Integer,Integer[]> entry = iterator.next();
ecgvalue[0][i] = entry.getKey();
ecgvalue[1][i] = entry.getValue()[1];
i++;
}
value.clear();
System.out.println(ecgvalue[0][1] + " " + ecgvalue[1][1]);
}
}
最后我采用了HashMap<Integer, Object>的方式搞定
但网上的一键多值的方法还是有用的,具体就去找别人的博客吧
http://blog.csdn.net/hfmbook/article/details/7593541
http://blog.csdn.net/xiangluer/article/details/52025654
其实也可以用HashMap<String, ArrayList<Integer>>实现吧
http://blog.csdn.net/shuishui77/article/details/51077714