Je stocke des objets Item dans un ArrayList. La classe Item a un champ flottant appelé field1. Je souhaite récupérer les objets Item de itemsList dans l'ordre décroissant de field1.

List<Item> itemsList = new ArrayList<Item>();
itemsList.add(new Item(...));

Voici ce que j'ai essayé:

public class Item implements Comparable {

    //...

    public float compareTo(Item it)
    {
        return(similarity - it.similarity);
    }
}

List<Item> sortedItems = Collections.sort(itemsList);

Le problème est que compareTo devrait renvoyer int, alors que j'ai float. Alors, quelle approche dois-je appliquer pour trier les valeurs float?

0
Dinosaurius 21 avril 2017 à 16:06

3 réponses

Meilleure réponse

La signature de la méthode doit être:

public int compareTo(Item it)

Au lieu de renvoyer un float. Pour le moment, vous n'implémentez pas l'interface Comparable.

La mise en œuvre la plus simple serait:

public int compareTo(Item it) {
  return Float.compare(similarity, it.similarity);
}
1
assylias 21 avril 2017 à 13:10

CompareTo est supposé renvoyer seulement 3 valeurs possibles. 1, 0, -1. 1 signifie que l'objet est plus grand que ce à quoi il est comparé, 0 signifie qu'ils sont égaux et -1 signifie que l'objet est plus petit que ce à quoi il est comparé. Votre méthode compareTo devrait donc être assez simple.

public int compareTo(Item it)
    {
        if(this.field1 < it.getField1()) {
          return -1;
        }
        else if( this.field1 > it.getField1()) {
           return 1;
        }
       else {
       return 0;
      }
    }
0
victor 21 avril 2017 à 13:10

La valeur de retour exacte de campareTo() n'a pas d'importance. Il est soit inférieur à 0, exactement 0 ou supérieur à 0. vous pouvez par exemple renvoyer -1 pour chaque différence inférieure à 0, 1 pour chaque différence supérieure à 0 et enfin 0 pour 0.

Comme Float est déjà comparable, ce serait facile: similarity.compareTo(it.similarity)

0
kalsowerus 21 avril 2017 à 13:10