我正在创建一个扫描蓝牙信标的应用程序。我有一个创建映射的方法,该映射包含信标的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映射中的所有项目返回相同的值。难道我做错了什么?有人可以帮忙吗?
答案 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;
}
}