web-dev-qa-db-ja.com

2つの整数のMod除算

「演算子%は引数タイプInteger、Integerに対して未定義です」というエラーが表示され続けます。なぜこれが発生するのかよくわかりません。モジュラー除算では小数を返すことができないので、整数値でも大丈夫だと思いました。

これは、私が作成しているプログラムのメソッド内で発生しています。コードは次のとおりです。

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

メソッドは未完成ですが、エラーが発生します

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

そして

    table[key % tableSize] = node;

どんな助けや提案もいただければ幸いです。

6
user2268305

Java 1.5および1.6で正常にコンパイルできるサンプル_Integer % Integer_コードを取得できましたが、1.4ではコンパイルできませんでした。

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

これは1.4のエラーです:

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

最も合理的な説明は、 Javaは1.5で自動ボクシングと自動アンボックスを導入した であるため、1.5より前のJavaコンパイラ、たとえば1.4を使用する必要があるということです。

ソリューション:

  • Java 1.5/1.6 /1.7にアップグレードします。
  • 1.4を使用する必要がある場合は、Integer.intValue()を使用してint値を抽出します。この値で、_%_演算子を使用できます。
7
rgettman

これは私にとってはうまくいきます。

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

int z = x % y;

System.out.println(z);

問題はありません。出力:

1

どのようなエラーが発生していますか?どのバージョンのJavaを使用していますか?1.5未満のJavaを使用しているようです。

2
durron597

ここで試みているのはボックス化解除と呼ばれ、オブジェクトをプリミティブ型に自動変換します(逆の方法は自動ボックス化です)。

Javaドキュメントには次のように書かれています:


Javaコンパイラは、ラッパークラスのオブジェクトが次の場合にボックス化解除を適用します。

  • 対応するプリミティブ型の値を期待するメソッドにパラメーターとして渡されます。
  • 対応するプリミティブ型の変数に割り当てられます。

したがって、1つの可能性は、notこれらのいずれかを実行していることです。一見すると、mod式をメソッドに渡したり、変数に割り当てたりしていないように見えますが、それは有効です。 、少なくとも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";
    }
}
_

もう1つの可能性は、自動ボックス化とボックス化解除が導入されたpre Java 5環境を使用していることです。

その場合の最善の策は、おそらく明示的であり、Integer.intValue()を使用して基になるintに到達することです。

ただし、キーにintIntegerではなく)を使用し、必要から(追加するとき)のポイントでのみボックス化することを検討することもできます。 Entryに変換します)。もちろん、確実にベンチマークする必要がありますが、プリミティブ型を使用する方が速い場合があります。

1
paxdiablo

整数を整数に変換してから、%を実行してください。

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