2016-06-30 3 views
0

J'essaie de parcourir une boucle for et de définir des éléments d'une liste en fonction de l'itération à laquelle elle se trouve, mais le type d'itération n'est pas du même type que la liste Je veux accéderType d'itérateur de boucle différent de celui auquel j'essaie d'accéder

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

l'erreur affichée est que la balise n'est pas le bon type, il est censé être un entier, mais Beacons ne sont pas des entiers. Est-ce que quelqu'un connaît un moyen d'ajouter temporairement un autre itérateur ou un autre balise à un entier? Btw Les balises sont juste un objet que j'ai créé, mais elles sont constituées de nombres UUID, majeurs et mineurs. Cela pourrait ne pas être pertinent, mais juste au cas où vous vouliez savoir. Je vous remercie!

+4

Vous essayez de stocker des paires clé-valeur composée d'une balise et une distance telle que donnée une balise, vous pouvez rechercher une distance? Si c'est le cas, vous avez besoin d'un 'Map ', pas d'un 'List'. Aussi, si c'est le cas, 'Beacon' doit implémenter correctement' equals() 'et' hashCode() '. –

+0

Juste un peu de nitpicking: cela aide vraiment à essayer de comprendre le message d'erreur que le compilateur vous donne! Jim Garrison a raison, d'ailleurs. –

+0

@JimGarrison oui c'est ce que j'essaye de faire, merci j'implémenterai ça – Wongesse

Répondre

3

Vous devez utiliser un Map au lieu d'un 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; 
} 

Lorsque vous faites cela, vous devez également mettre en œuvre equals() et hashCode() dans Beacon sur la base quelle que soit "l'égalité" signifie, et ils doivent être compatibles les uns avec les autres. Lisez le Javadoc pour l'interface Map.

Dans votre cas, il est probable que "égal" doit prendre en compte les numéros de version UUID et majeur/mineur. Ce qui suit suppose que major/minor sont des types primitifs, et que UUID ne peut pas être nul. Ajouter vérification supplémentaire ou remplacer equals() pour == selon le cas:

@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(); 
}