Question

J'ai le code suivant, qui divise un vecteur en un vecteur chaîne (à utiliser comme clé) et un entier à la fin (à utiliser en tant que valeur).

payoffs.put(new Vector<String>(keyAndOutput.subList(0, keyAndOutput.size() - 1)), Integer.parseInt(keyAndOutput.lastElement()));

La TreeMap en question est construite à l'aide d'un comparateur utilisant la méthode suivante, qui impose un ordre lexicographique, indépendant de la casse, qui prend également en compte la longueur (les vecteurs les plus longs sont toujours & plus grands & que les plus courts). ).

public int compare(Vector<String> arg0, Vector<String> arg1) {
        int sgn = 0;
        if (arg0.size() > arg1.size()) {
            return 1;
        } else if (arg0.size() < arg1.size()) {
            return -1;
        }
        for (int i = 0; i < arg0.size(); i++) {
            if (arg0.elementAt(i).compareToIgnoreCase(arg1.elementAt(i)) == 1) {
                sgn = 1;
                break;
            } else if (arg0.elementAt(i).compareToIgnoreCase(arg1.elementAt(i)) == -1) {
                sgn = -1;
                break;
            } else {
                continue;
            }
        }
        return sgn;
    }

Maintenant, pour le problème ... Bien que le fichier texte ait 8 entrées lues, la carte ne reçoit jamais plus de 2 entrées. Une fois qu'une entrée (clé) est entrée, elle STAYE, mais la valeur change à chaque itération du processus d'analyse (chaque fois qu'il lit un nouveau vecteur à partir d'une ligne du fichier). Il jette toutes les autres clés sauf les deux.

Est-ce un problème avec mon comparateur? Ou la TreeMap fait-elle quelque chose que je ne comprends pas avec put ()?

Était-ce utile?

La solution

Répondre à Ne répondez pas à la question, avec mais quelques points mineurs à propos de votre code:

  1. Vous ne devez pas faire la comparaison deux fois; comparer une fois et attribuer le résultat à sgn; alors casser si! = 0
  2. Votre autre action continue est redondante.
  3. Vous ne devriez pas comparer pour -1 ou 1, mais < 0 ou > 0; beaucoup de méthodes compareTo retournent en fonction de (x1-x2), ce qui peut donner n'importe quel nombre négatif ou positif.

EDIT: Doh! Et, bien sûr, le retour de String.compareToIgnoreCase () est l’un de ces comparateurs (3). Comme l’a souligné l’autre réponse en même temps que la mienne, ce sera probablement la cause de votre erreur.

EDIT2: La réponse introduite a été corrigée pour refléter la réponse donnée à la question.

Autres conseils

Je ne sais pas si cela est la cause de votre problème, mais les fonctions de comparaison en Java renvoient généralement un résultat négatif ou positif ou 0, pas nécessairement 1 ou -1.

Je suis prêt à parier que vous obtenez une valeur différente de zéro de compareToIgnoreCase, mais parce que ce n'est pas 1 ou -1 que vous échouez et que vous finissez par retourner 0 même si les tableaux sont identiques en longueur et non pas contenus. Essayez de vérifier contre & Gt; 0 et & Lt; 0

En outre, vous pouvez mieux organiser ce code. Par exemple, effectuez une comparaison, sauvegardez les résultats, puis activez-les. De cette façon, vous faites peut-être deux comparaisons coûteuses pour rien.

En fait, le truc, c’est peut-être que j’ai mal interprété la documentation de comparTo () qui a été réellement dite ... rapportera une fois le test effectué.

Aaand, c'était ça. Merci les gens.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top