来自三个传感器(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中)

感谢您在问题中加上一段代码。放置完整的方法或类将使其变得更容易帮助。祝好运!

10-01 05:43
查看更多