安卓编程中关于hashmap及其他的一点问题

最近帮师姐改安卓程序,中间一个模块要实现采集由按键控制的某段时间的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();//
}


由于一开始是只用了ecg的值,是key-value的典型map,我就用了HashMap<Integer,Integer>,但是假如ppg的数据后就是value-ecg,ppg的一键对多值的情况,用什么来存储呢,我第一反应是用数组,于是写了这么个东西:

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





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值