来自三个传感器(x、y 和 z)的连续数据存储在 Hashmap 中(传感器名称为 Key,ArrayList 中的数据为 value)。对于来自每个传感器的数据,我需要应用低通滤波器。我试图通过以下方式做到这一点:
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);
}
在运行上面的代码 fragment 时,循环永远不会进入 else 条件。
在我的例子中,当应用程序启动时,它可能不会在开始时从所有传感器获取数据。当每个传感器至少有一个数据时,上面的代码 fragment 开始。因此,当代码开始时,可能有很多数据来自一个传感器,而只有一个数据来自另一个传感器。我需要使用过去的数据和当前的数据来过滤传感器数据。
HashMap ContinuousDataFromSensors
包含原始数据(Key:传感器名称,Value:ArrayList)
我的方法正确吗?
谢谢。
最佳答案
在循环运行之前创建 FilteredDataOfSensors
的方式可能是您的问题。也许它需要提升为类成员并持久化并在循环的多次运行中重复使用。
因为您询问的 else
代码仅在 FilteredDataOfSensors
中已存在 Sensor.getKey() 时运行。但是 FilteredDataOfSensors
刚刚创建,因此在循环开始时它始终为空。
也许如果代码循环的 ContinuousDataFromSensors
具有给定 Sensor.getKey() 的多个条目。但这似乎不太可能,因为大多数 map 都使用唯一键。而且由于传感器的多个数据点不会进入多个 map 条目,它们都在一个 map 条目的 ArrayList 中)
顺便说一下,感谢您将代码 fragment 与您的问题放在一起。放置完整的方法或类可以更轻松地提供帮助。祝你好运!
关于java - 在 Java 中的 Hashmap 中使用过去的数据和 ArrayList 的当前数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53666582/