Мод деление двух целых

Я продолжаю получать сообщение об ошибке "Оператор% не определен для типов аргументов 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;

любая помощь или предложения будут оценены.

4 ответа

Решение

Я мог бы получить образец 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 ввел autoboxing и autounboxing в 1.5, вы должны использовать компилятор Java до версии 1.5, скажем, 1.4.

Решения:

  • Обновление до Java 1.5/1.6/1.7.
  • Если вы должны использовать 1.4, используйте Integer.intValue() извлечь int значения, по которым вы можете использовать % оператор.

Это прекрасно работает для меня.

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

int z = x % y;

System.out.println(z);

Нет проблем. Выход:

1

Какую ошибку вы получаете? Какую версию Java вы используете? Похоже, что вы используете Java ниже 1,5.

То, что вы пытаетесь здесь, называется распаковкой, автоматическим преобразованием объекта в примитивный тип (другой путь - это автобокс).

Документы Java имеют это, чтобы сказать:


Компилятор Java применяет распаковку, когда объект класса-обёртки:

  • Передается в качестве параметра в метод, который ожидает значение соответствующего типа примитива.
  • Присваивается переменной соответствующего примитивного типа.

Таким образом, одна возможность состоит в том, что вы не выполняете одну из этих вещей и, хотя на первый взгляд кажется, что вы не передаете выражение вашего мода методу и не присваиваете его переменной, это допустимо, по крайней мере, в 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). Вполне возможно, будет быстрее использовать примитивный тип, хотя вы, конечно, должны проверить его, чтобы быть уверенным.

Попробуйте преобразовать целые числа в целые, затем запустите %,

if(table[key.intValue() % tableSize.intValue()] == null)
        table[key.intValue() % tableSize.intValue()] = node;
Другие вопросы по тегам