web-dev-qa-db-fra.com

Division de mod de deux entiers

L'erreur "L'opérateur% n'est pas défini pour le (s) type (s) d'argument (s) Integer, Integer" ne me semble pas claire. Je ne sais pas trop pourquoi cela se produit. Je pensais que puisque la division modulaire ne peut pas renvoyer de décimales, le fait d’avoir des valeurs entières serait bien. 

Cela se passe dans une méthode dans un programme que je crée. Le code est comme suit:

    public void addToTable(Integer key, String value)
{
    Entry<Integer, String> node = new Entry<Integer, String>(key, value);
    if(table[key % tableSize] == null)
        table[key % tableSize] = node;
}

La méthode est inachevée mais l'erreur se produit à 

    if(table[key % tableSize] == null)

et 

    table[key % tableSize] = node;

toute aide ou suggestion serait appréciée. 

6
user2268305

Je pourrais obtenir un exemple de code Integer % Integer pour compiler avec succès en Java 1.5 et 1.6, mais pas en 1.4.

public static void main(String[] args)
{
   Integer x = 10;
   Integer y = 3;
   System.out.println(x % y);
}

C'est l'erreur de la version 1.4:

ModTest.Java:7: operator % cannot be applied to Java.lang.Integer,Java.lang.Integer
       System.out.println(x % y);
                            ^

L’explication la plus raisonnable est que, parce que Java introduisant l’autoboxing et l’autounboxing dans 1.5 , vous devez utiliser un compilateur Java antérieur à 1.5, par exemple 1.4.

Solutions:

  • Mise à niveau vers Java 1.5/1.6/1.7.
  • Si vous devez utiliser 1.4, utilisez Integer.intValue() pour extraire les valeurs int , Sur lesquelles vous pouvez utiliser l'opérateur %.
7
rgettman

Cela fonctionne bien pour moi.

Integer x = Integer.valueOf(10);
Integer y = Integer.valueOf(3);

int z = x % y;

System.out.println(z);

Pas de problème. Sortie:

1

Quelle erreur obtenez vous? Quelle version de Java utilisez-vous? Il semble que vous utilisiez Java en dessous de 1.5.

2
durron597

Ce que vous essayez ici s'appelle unboxing, la conversion automatique d'un objet en un type primitif (l'inverse est automatique).

Les docs Java ont ceci à dire:


Le compilateur Java applique unboxing lorsqu'un objet d'une classe wrapper est:

  • Transmis en tant que paramètre à une méthode qui attend une valeur du type primitif correspondant.
  • Assigné à une variable du type primitif correspondant.

Donc, une possibilité est que vous pasfaites l'une de ces choses et, bien qu'il semble à première vue que vous ne transmettez pas votre expression mod à une méthode, ni ne l'attribuez à une variable, elle est valide, du moins en Java 6:

class Test {
    public static void main(String args[]) {
        Integer x = 17;
        Integer y = 5;
        System.out.println (x % y);
        String [] z = new String[10];
        z[x % y] = "hello";
    }
}

L’autre possibilité est que vous utilisiez un environnement antérieur à Java 5, où l’autoboxing et le unboxing ont été introduits.

La meilleure solution dans ce cas est probablement d’être explicite et d’utiliser Integer.intValue() pour obtenir le intsous-jacent.

Cependant, vous pouvez également envisager d’utiliser un intname_pas Integername__) pour la clé et de la mettre en boîte uniquement au point où vous _ (besoinà (lorsque vous l’ajoutez à un Entryname__). le type primitif, bien que vous deviez bien sûr le comparer pour en être sûr.

1
paxdiablo

Essayez de convertir les entiers en entiers, puis exécutez %.

if(table[key.intValue() % tableSize.intValue()] == null)
        table[key.intValue() % tableSize.intValue()] = node;
0
Chris Chambers