来自三个传感器(x,y和z)的连续数据存储在Hashmap中(传感器名称为Key,而ArrayList中的数据为值)。对于每个传感器的数据,我需要应用一个低通滤波器。我正在尝试通过以下方式进行操作:
ArrayList<Float> TempArray = new ArrayList();
Map<String,ArrayList<Float>> FilteredDataOfSensors = new HashMap<String, ArrayList<Float>>();
float filteredData;
for(Map.Entry<String , ArrayList<Float>>Sensors:ContinuousDataFromSensors.entrySet())
{
TempArray = AccessPointId.getValue();
String SensorName = Sensors.getKey();
ArrayList<Float> arrayOfFilteredData = FilteredDataOfSensors.get(SensorName);
if(arrayOfFilteredData == null)
{
arrayOfFilteredData = new ArrayList<Float>();
FilteredDataOfSensors.put(SensorName,arrayOfFilteredData);
}
if(arrayOfFilteredData.size() == 0 && TempArray.size() == 1) {filteredData = TempArray.get(0); Log.d("Test", "Inside If");}
else if(arrayOfFilteredData.size() == 0 && TempArray.size() > 1) {filteredData = TempArray.get(TempArray.size()-1);Log.d("Test", "Inside else If");}
else { FilteredData = (float) (0.5 * TempArray.get(TempArray.size()-1) + 0.5 * arrayOfFilteredData.get(arrayOfFilteredData.size()-1)); Log.d("Test", "Inside else");}
arrayOfFilteredData.add( FilteredData);
}
运行上面的代码片段时,循环永远不会进入else条件内。
就我而言,当应用启动时,它可能一开始可能无法从所有传感器获取数据。当每个传感器至少有一个数据时,以上代码段将启动。因此,在代码启动时,可能有来自一个传感器的许多数据,而只有来自另一个传感器的一个数据。我需要使用过去的数据和当前的数据来过滤传感器数据。
哈希图
ContinuousDataFromSensors
包含原始数据(键:传感器名称,值:ArrayList中的连续传感器数据)我的方法正确吗?
谢谢。
最佳答案
在循环运行之前创建FilteredDataOfSensors
的方式可能是您遇到的问题。也许需要将其提升为类成员,并将其持久化并重用于循环的多次运行。
因为您询问的else
代码仅在FilteredDataOfSensors
中已经存在Sensor.getKey()时运行。但是FilteredDataOfSensors
是刚刚创建的,因此在循环开始时它始终为空。
也许代码循环的ContinuousDataFromSensors
对于给定的Sensor.getKey()有多个条目。但这似乎不太可能,因为大多数地图使用唯一键。而且,由于传感器的多个数据点不在多个映射条目中,因此它们都在一个映射条目的ArrayList中)
感谢您在问题中加上一段代码。放置完整的方法或类将使其变得更容易帮助。祝好运!