For 循环迭代器类型与我尝试访问的类型不同

For loop iterator type not the same as type I am trying to access

我正在尝试遍历 for 循环并根据它所在的迭代设置列表的元素,但迭代类型与我要访问的列表的类型不同

private List<Double> myBeaconDistances = new ArrayList<>();

private List getBeaconDistances(List<Beacon> beacons){
    for (Beacon beacon : beacons) {
        double distance = Utils.computeAccuracy(beacon);
        this.myBeaconDistances.set(beacon, distance);

    }

    return myBeaconDistances;
}

显示的错误是beacon不是正确的类型,它应该是一个整数,但是Beacons不是整数。有谁知道添加另一个迭代器或暂时将信标设置为整数的方法?

distance = Utils.commputeAccuracy(beacon) will return an double.

顺便说一句,信标只是我制作的一些对象,但它们由 UUID、主要和次要数字组成。这可能无关紧要,但以防万一您想知道。谢谢!

您在 ArrayList 上调用 set。第一个参数应该是 int,而不是 Beacon 类型。

this.myBeaconDistances.set(beacon, distance);

https://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html#set(int,%20E)

您需要使用 Map 而不是 List:

private Map<Beacon,Double> myBeaconDistances = new HashMap<>();

private Map<Beacon,Double> getBeaconDistances(List<Beacon> beacons){
    for (Beacon beacon : beacons) {
        double distance = Utils.computeAccuracy(beacon);
        this.myBeaconDistances.put(beacon, distance);

    }

    return myBeaconDistances;
}

执行此操作时,还必须根据 "equality" 的含义在 Beacon 中实现 equals()hashCode(),并且它们必须彼此一致。阅读 Map 接口的 Javadoc。

在您的情况下,"equals" 可能必须考虑 UUID 和 major/minor 版本号。下面假定 major/minor 是原始类型,并且 UUID 不能为 null。添加额外的检查或根据需要用 equals() 替换 ==

@Override
public boolean equals(Object other)
{
    if (this == other) return true;
    if (other == null || !this.isAssignableFrom(other)) return false;
    Beacon b = (Beacon) other;
    return this.uuid.equals(b.uuid) && this.major == b.major && this.minor == b.minor;
}

@Override
public int hashCode()
{ 
    return 2047*this.major + this.minor + this.uuid.hashCode();
}