gpt4 book ai didi

java - 在 map 中插入列表的平均值

转载 作者:行者123 更新时间:2023-12-02 05:41:26 25 4
gpt4 key购买 nike

我正在创建一个扫描蓝牙信标的应用程序。我有一个方法可以创建一个映射,其中包含信标的 ID(MAC 地址)和属于该信标的最近 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;
}

蓝牙扫描仪每秒运行一次, map 如下所示:

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]

我想要一个新的 map ,其中 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;
}

我尝试过这样的事情。 map map包含最近10个值:

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

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

最佳答案

您可以创建一个类 Beacon 来完成这项工作(收集原始数据,计算平均值,仅保留最后 10 个值和 2 个值):

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;
}
}

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

java.util.Map<String,Beacon> beacons=new java.util.HashMap<>(); 

public void add(String beaconId, Integer rawValue)
{
//adds a new beacon for a new beaconId
map.computeIfAbsent(beaconId,beaconId->new Beacon()).add(rawValue);
}

关于java - 在 map 中插入列表的平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56135338/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com