12
votes

Aide à comparer les variables de l'élément de flotteur à l'aide de comparateurs

Je suis capable de comparer les cordes bien, mais je voudrais savoir comment je peux classer les numéros de points flottants?

getchange () renvoie une chaîne. Je veux pouvoir trier descendant. Comment puis-je faire cela?

Mise à jour: xxx

Je reçois l'erreur de la compilation: < Pré> xxx


1 commentaires

Outre le numéro NAN, vous n'avez aucune déclaration de retour garanti dans votre code. De manière réaliste, vous le faites, mais le compilateur ne peut pas dire cela parce que vous avez trois déclarations différentes. Cela ne peut pas évaluer ceux-ci avant l'exécution, de sorte que cela pense que vous pourriez réellement passer la dernière déclaration si et il n'y a pas de clause de retour.


4 Réponses :


17
votes

Lire le Javadoc de comparateur # Comparer () code> méthode.

compare ses deux arguments pour la commande. retourne un entier négatif, zéro ou un entier positif, car premier argument est inférieur ou supérieur à la seconde. strong> p> blockQuote>

donc, essentiellement em>: p> xxx pré>

ou si vous aimez les opérateurs conditionnels: P>

return o1.getChange() < o2.getChange() ? -1 
     : o1.getChange() > o2.getChange() ? 1 
     : 0;


3 commentaires

Faites attention à Float.Nan! Je suppose que vos données ne sont pas nanes, mais comme Nan d'un côté de toute comparaison retournera toujours false (même float.nan == float.nan est faux!), Vous voudrez peut-être un flotteur.Innan (Change1) ou quel que soit votre chèque. Sinon, le tri sera apparemment aléatoire s'il y a une NAN impliquée.


Je reçois l'erreur de l'heure de la compilation (voir le code mis à jour dans ma question): Cette méthode doit renvoyer le résultat de type int ChangeComparator.java


L'erreur de compilation parle pour elle-même. Vous devez vous assurer que TOUJOURS retourne un int . Je vais éditer l'exemple.



17
votes

Que diriez-vous:

Comparator<Quote> changeComparator = Comparator.comparingDouble(Quote::getChange);


1 commentaires

C'est la meilleure réponse - Déléguer la comparaison avec le comparète de flotteur.



10
votes

Vous pouvez utiliser float.cacher (flotteur F1, flotteur F2) code> :

  public static int compare(float f1, float f2)


0 commentaires

0
votes
import java.io.*;
import java.util.*;

public class Main {

    public static void main(String[] args) throws IOException {
        Scanner input = new Scanner(System.in);
        int tc = input.nextInt();
        int alpha = 0;
        while (tc-- > 0) {
            int ttc = input.nextInt();
            int sort = input.nextInt();
            input.nextLine();
            Vector<student> v = new Vector<>();
            alpha++;
            while (ttc-- > 0) {
                String name = input.next();
                int weit = input.nextInt();
                int age = input.nextInt();
                float hight = input.nextFloat();

                v.add(new student(name, weit, age, hight));
            }
            Collections.sort(v);
            int count = 0;
            System.out.println("CENARIO {" + alpha + "}");
            for (student s : v) {
                System.out.print((count + 1) + " - ");
                System.out.println(s.name);
                count++;
                if (count == sort) {
                    break;
                }
            }
        }
    }

    private static class student implements Comparable<student> {

        String name;
        int weit;
        int age;
        float hight;

        public student(String name, int weit, int age, float hight) {
            this.name = name;
            this.weit = weit;
            this.age = age;
            this.hight = hight;
        }

        @Override
        public int compareTo(student t) {
            if (this.weit - t.weit != 0) {
                return t.weit - this.weit;
            }
            if (this.age - t.age != 0) {
                return this.age - t.age;
            }
            if (this.hight - t.hight != 0) {
                return Float.compare(this.hight, t.hight);
            }
            return this.name.compareTo(t.name);

        }
    }
}

0 commentaires