Подтвердить что ты не робот

Почему класс Java Integer не имеет метода compare()?

Double имеет Double.compare для сравнения двух двойных примитивов. Почему Integer не имеет одного?

Я понимаю это несколько тривиальное количество кода для написания, но спрашиваю из любопытства.

Изменить: я понимаю, что Integer и Double имеют compareTo. Но при использовании compareTo требуется бокс int примитив в объекте Integer, который имеет довольно высокую стоимость. Кроме того, inta > intb - это не то же самое, что сравнивать (inta, intb), поскольку последний возвращает +1, 0 или -1, а первый - true/false....

4b9b3361

Ответ 1

Это был недосмотр, что Java 7 решит

http://download.oracle.com/javase/7/docs/api/java/lang/Integer.html#compare%28int,%20int%29

public static int compare (int x,         int y)

Сравнивает два значения int численно. Возвращаемое значение совпадает с возвращаемым значением:

Integer.valueOf(x).compareTo(Integer.valueOf(y))

Параметры:   x - первый int для сравнения   y - второй int для сравнения Возвращает:   значение 0, если x == y; значение меньше 0, если x < у; и значение больше 0, если x > y Поскольку:   1.7

Ответ 2

compare в Double имеет тот же эффект, что и:

new Double(d1).compareTo(new Double(d2))

Это означает, что он учитывает NaN, +0 и -0 (цитируя документ для compareTo()):

  • Double.NaN считается этим методом равным себе и больше всех других двойных значений (в том числе Double.POSITIVE_INFINITY).
  • 0.0d считается этим методом больше -0.0d.

Так как Integer не имеет NaN, и оба +0 и -0 будут считаться просто 0, такой метод действительно не нужен для функциональности.

Ответ 3

Сравнение ints таким образом тривиально, сравнение двойников на самом деле намного сложнее, чем может показаться на первый взгляд. Вы должны иметь дело с такими вещами, как значения ошибок и менее очевидными случаями, такими как NaN.

Подробнее см. этот вопрос.

В любом случае, с Java 7, у вас будет такой метод для ints!

Ответ 4

Значения с плавающей запятой не обязательно могут быть взаимно сопоставлены из-за неточности в представлении с плавающей запятой, поэтому для сравнения двух значений с плавающей запятой требуется оператор compare(), по существу, убедившись, что разница между ними не больше, чем (маленькое) значение ошибки. Целые числа могут быть взаимно сопоставлены, поэтому можно использовать оператор равенства.

Ответ 5

Вероятно, потому, что операция compare относительно проста (но многие люди ошибаются). И по сравнению с double, это действительно так.

Я тоже хотел бы, чтобы этот метод встроен, что заставляет других людей писать более простой код. Но пока Oracle не видит в этом проблемы, мы должны полагаться на Google Guava или подобные библиотеки, чтобы предоставить отсутствующие биты.