在地图中插入列表的平均值

时间:2019-05-14 17:06:16

标签: java

我正在创建一个扫描蓝牙信标的应用程序。我有一个创建映射的方法,该映射包含信标的ID(MAC ADDRESS)和属于该信标的10个最近的RSSI值作为列表。看起来像这样:

public Map<String, List<Integer>> addToMap(Map<String, List<Integer>> mapToReturn, String beaconUID, Integer beaconRSSI) { 

List<Integer> temp = mapToReturn.get(beaconUID);

if (temp == null) {             
    temp = new ArrayList();
}

if (temp.size() >= 10) {             
    temp.remove(0); 
}

temp.add(beaconRSSI);

mapToReturn.put(beaconUID, temp); 

return mapToReturn; 
}

蓝牙扫描器每秒运行一次,地图看起来像这样:

beacon1, [-55, -55, -54, -54, -55, -54, -54, -54, -54, -55]
beacon2, [-61, -61, -61, -61, -60, -61, -60, -61, -60, -60]
beacon3, [-69, -69, -68, -68, -68, -69, -70, -68, -69, -69]

我想创建一个新地图,其中ID再次是键,但值是列表的平均值。我想在每次扫描仪运行时向列表中添加一个新的平均值,但是列表中只有2个项目(我在每次运行后都删除第一个索引)。经过两次迭代,它看起来像这样:

beacon1, [-54,2, -55,6]
beacon2, [-61,2, -60,1]
beacon3, [-68,9, -70,0]

为此,我制作了一种与第一种方法非常相似的方法。

public Map<String, List<Float>> addAverage(Map<String, List<Float>> mapToReturn, String beaconUID, Float beaconRSSI) {

    List<Float> temp = mapToReturn.get(beaconUID);

    if (temp == null) {
        temp = new ArrayList();
    }

    if (temp.size() >= 2) {
        temp.remove(0);
    }

    temp.add(beaconRSSI);
    mapToReturn.put(beaconUID, temp);


    return mapToReturn;
}

我已经尝试过类似的方法。该地图包含10个最近值:

for (Map.Entry<String, List<Integer>> entry : map.entrySet()) {
    if (entry.getValue().size() >= 10) {
    addAverage(RSSIAverageMap, scanResult.getBleDevice().getMacAddress(),getAverageNumber(entry.getValue())));
}
}

这只是为RSSIAverageMap映射中的所有项目返回相同的值。难道我做错了什么?有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

您可以创建一个类var list = db.Lands.Where(lnd => lnd.Owners.Any(x => x.Name.Contains("Smit"))); 来完成工作(收集原始数据,计算平均值,仅保留最后10个或2个值):

Beacon

然后,您的工作变得更加简单,因为您只需要添加原始数据即可:

public class Beacon
{
    private java.util.LinkedList<Integer> rawValues=new java.util.LinkedList<>();
    private java.util.LinkedList<Double> averages=new java.util.LinkedList<>();

    public void addRaw(Integer value)
    {
        rawValues.add(value);
        calculateAverage();
        if(rawValues.size()>10)
            rawValues.removeFirst();
    }

    private void calculateAverage()
    {
        Double average=rawValues.stream().collect(java.util.stream.Collectors.averagingDouble(Integer::doubleValue));
        averages.add(average);
        if(averages.size()>2)
            averages.removeFirst();
    }

    public List<Double> getAverages()
    {
        return averages;
    }

    public List<Integer> getRawValues()
    {
        return rawValues;
    }
}