Mod划分为两个整数

时间:2013-04-25 22:37:42

标签: java division modular-arithmetic

我一直收到错误“对于参数类型,运算符%未定义整数,整数”我不太清楚为什么会发生这种情况。我认为,因为模块化除法不能返回具有整数值的小数点。

这是在我正在创建的程序中的方法中发生的。 代码如下:

    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;

任何帮助或建议将不胜感激。

4 个答案:

答案 0 :(得分:7)

我可以获得一些示例Integer % Integer代码,以便在Java 1.5和1.6中成功编译,但不能在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 introduced autoboxing and autounboxing in 1.5,你必须使用1.5之前的Java编译器,比如1.4。

解决方案:

  • 升级到Java 1.5 / 1.6 / 1.7。
  • 如果您必须使用1.4,请使用Integer.intValue()提取int 值,您可以使用%运算符。

答案 1 :(得分:2)

这对我来说很好。

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

int z = x % y;

System.out.println(z);

没问题。输出:

1

你得到什么错误?您使用的是哪个版本的Java?看来你使用的是1.5以下的Java。

答案 2 :(得分:1)

你在这里尝试的东西称为拆箱,将对象自动转换为基本类型(另一种方式是自动装箱)。

Java文档可以这样说:


当包装类的对象为:

时,Java编译器应用拆箱
  • 作为参数传递给期望相应基元类型值的方法。
  • 分配给相应基元类型的变量。

所以有一种可能性就是你做其中一件事,虽然乍看之下你既没有将你的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";
    }
}

另一种可能性是您正在使用Java 5之前的环境,其中引入了自动装箱和拆箱。

在这种情况下,最好的选择可能是明确的,并使用Integer.intValue()来获取基础int

但是,您可能还需要考虑使用int(不是Integer)作为密钥,并且仅在您需要时将其装箱(当您将其添加到Entry)。使用原始类型可能会更快,但您当然应该对其进行基准测试。

答案 3 :(得分:0)

尝试将整数转换为整数,然后运行%

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