Почему класс Java Integer не имеет метода compare()?
Double имеет Double.compare для сравнения двух двойных примитивов. Почему Integer не имеет одного?
Я понимаю это несколько тривиальное количество кода для написания, но спрашиваю из любопытства.
Изменить: я понимаю, что Integer и Double имеют compareTo. Но при использовании compareTo требуется бокс int примитив в объекте Integer, который имеет довольно высокую стоимость. Кроме того, inta > intb - это не то же самое, что сравнивать (inta, intb), поскольку последний возвращает +1, 0 или -1, а первый - true/false....
Ответы
Ответ 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 или подобные библиотеки, чтобы предоставить отсутствующие биты.