2010-11-04 6 views
20
BigInteger bigInteger = ...; 


if(bigInteger.longValue() > 0) { //original code 
    //bigger than 0 
} 

//should I change to this? 
if(bigInteger.compareTo(BigInteger.valueOf(0)) == 1) { 
    //bigger than 0 
} 

J'ai besoin de comparer certaines valeurs BigInteger arbitraires. Je me demande quelle approche est correcte. Étant donné le code ci-dessus, lequel devrait-on utiliser? Le code original est sur le dessus .. Je pense à changer à la deuxième approche.Java, comparant les valeurs BigInteger

Répondre

32

La première approche est erronée si vous voulez tester si le BigInteger a une valeur postive: longValue juste renvoie le ordre faible 64 bits qui peut revenir le signe .. Donc, le test pourrait échouer pour un BigInteger positif. La seconde approche est meilleure (voir Bozhos answer pour une optimisation).

Une autre alternative: BigInteger#signum rendements 1 si la valeur est positive:

if (bigInteger.signum() == 1) { 
// bigger than 0 
} 
+0

merci pour le conseil, mais vous voulez dire «plus gros _than_ 0» non? Juste nitpicking ..: p –

+12

@Rosdi - bien sûr, "que". Somatimas that 'e' end tha 'un' kay chenga plecas sur mon kayboerd ;-) –

26

Si vous utilisez BigInteger, cela suppose que vous avez besoin de plus grands nombres que long. Donc n'utilisez pas longValue(). Utilisez compareTo. Avec votre exemple, il vaut mieux être:

if (bigInteger.compareTo(BigInteger.ZERO) > 0) { 

} 
+5

True (+1), mais il faut vérifier pour '> 0', pas' == 1' (voir ma réponse) –

+0

@seanizer - tout fixe, et +1 à votre réponse pour laquelle. – Bozho

12

Ce n'est pas une réponse directe, mais une note importante sur l'utilisation compareTo(). Lors de la vérification de la valeur de compareTo(), vérifiez toujours x < 0, x > 0 et x == 0.
Ne pas tester pour x == 1

Des Comparable.compareTo() javadocs:

Compares cet objet avec l'objet spécifié pour l'ordre. Renvoie un entier négatif, zéro ou un entier positif car cet objet est inférieur, égal ou supérieur à l'objet spécifié.

Note:

  • A negative integer, pas -1.
  • A positive integer, et non 1.

est vrai, la vérification des ==1 et ==-1 travaillerait pour BigInteger. Voici le code BigInteger.compareTo():

public int compareTo(BigInteger val) { 
    if (signum == val.signum) { 
     switch (signum) { 
     case 1: 
      return compareMagnitude(val); 
     case -1: 
      return val.compareMagnitude(this); 
     default: 
      return 0; 
     } 
    } 
    return signum > val.signum ? 1 : -1; 
} 

Mais il est encore une mauvaise pratique, et explicitement recommandé contre la JavaDocs:

compare cette BigInteger avec le BigInteger spécifié. Cette méthode est fournie de préférence à des méthodes individuelles pour chacun des six opérateurs de comparaison booléens (<, ==,>,> =,! =, < =). L'idiome suggéré pour effectuer ces comparaisons est: (x.compareTo(y) <op> 0), où <op> est l'un des six opérateurs de comparaison.

+0

La spécification de 'BigInteger.compareTo()' dit explicitement '-1, 0, et 1' mais je suis d'accord en utilisant' x < 0', 'x == 0',' x> 0' semble plus intuitif que 'x == -1', 'x == 0',' x == 1'. –

+0

@Rosdi mais il dit aussi * L'idiome suggéré pour effectuer ces comparaisons est: ('x.compareTo (y) 0'), où' 'est l'un des six opérateurs de comparaison. * –