it-swarm.com.de

Mod Division von zwei ganzen Zahlen

Ich erhalte ständig die Fehlermeldung "Der Operator% ist für die Argumenttypen Integer und Integer nicht definiert. Ich bin nicht ganz sicher, warum dies geschieht. Ich dachte, da die modulare Division keine Dezimalzahlen zurückgeben kann, wäre das mit ganzzahligen Werten in Ordnung. 

Dies geschieht innerhalb einer Methode in einem von mir erstellten Programm. Der Code lautet wie folgt:

    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;
}

Die Methode ist noch nicht abgeschlossen, aber der Fehler tritt bei auf 

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

und 

    table[key % tableSize] = node;

jede Hilfe oder Anregung wäre dankbar. 

6
user2268305

Ich könnte etwas Integer % Integer-Beispielcode erhalten, der in Java 1.5 und 1.6 erfolgreich kompiliert werden kann, aber nicht in 1.4.

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

Dies ist der Fehler in 1.4:

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

Die vernünftigste Erklärung ist, dass, weil Java in 1.5 autoboxing und autounboxing eingeführt hat, Sie einen Java-Compiler von vor 1.5 benötigen, beispielsweise 1.4.

Lösungen:

  • Upgrade auf Java 1.5/1.6/1.7.
  • Wenn Sie 1.4 verwenden müssen, extrahieren Sie mit Integer.intValue() die int -Werte, für die Sie den Operator % verwenden können.
7
rgettman

Das funktioniert gut für mich.

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

int z = x % y;

System.out.println(z);

Keine Probleme. Ausgabe:

1

Was für einen Fehler bekommst du? Welche Java-Version verwenden Sie? Es scheint, dass Sie Java unter 1.5 verwenden.

2
durron597

Was Sie hier versuchen, nennt man Unboxing, die automatische Konvertierung eines Objekts in einen primitiven Typ (der umgekehrte Weg ist Autoboxing).

Die Java-Dokumente haben folgendes zu sagen:


Der Java-Compiler wendet das Unboxing an, wenn ein Objekt einer Wrapper-Klasse Folgendes ist:

  • Wird als Parameter an eine Methode übergeben, die einen Wert des entsprechenden Grundtyps erwartet.
  • Wird einer Variablen des entsprechenden Primitivtyps zugewiesen.

Eine Möglichkeit ist, dass Sie nicht eines dieser Dinge tun und obwohl es auf den ersten Blick so aussieht, als würden Sie Ihren Mod-Ausdruck weder an eine Methode übergeben noch einer Variablen zuweisen, es ist gültig. zumindest in 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";
    }
}

Die andere Möglichkeit ist, dass Sie eine vor Java 5-Umgebung verwenden, in der Autoboxing und Unboxing eingeführt wurden.

Die beste Wette ist in diesem Fall wahrscheinlich, explizit zu sein und Integer.intValue() zu verwenden, um an die zugrunde liegende int zu gelangen.

Sie können jedoch auch in Betracht ziehen, eine int (nicht Integer) für den Schlüssel zu verwenden und nur an der Stelle aufzurufen, an der Sie need to (wenn Sie sie einer Entry hinzufügen). Die Verwendung des primitiven Typs ist möglicherweise schneller, obwohl Sie dies natürlich als Benchmark verwenden sollten.

1
paxdiablo

Konvertieren Sie die Ganzzahlen in ints und führen Sie % aus.

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