2013-09-09 4 views
1
import java.awt.Rectangle; 
import java.util.Comparator; 
public class RectangleComparator implements Comparator 
{ 
     public int compare(Object object1, Object object2) 
     { 
     Rectangle rec1 = (Rectangle) object1; 
     Rectangle rec2 = (Rectangle) object2; 

     return rec1.getWidth().compareTo(rec2.getWidth()); 
    } 
} 

По какой-то причине я получаю ошибку double не может быть разыменован. Может ли кто-нибудь помочь мне понять, почему?Двойной нельзя разыменовать ...?

+0

Кстати, это редко хорошая идея, чтобы сравнить поплавка/двойные значения для точного равенство. См. Http://stackoverflow.com/questions/4915462/how-should-i-do-floating-point-comparison – sleske

ответ

3

Rocketboy правильно с точки зрения того, почему это происходит.

Рассмотрит с помощью Double класса-обертки, как этого

new Double(rec1.getWidth()).compareTo(rec2.getWidth()); 

только первого значение, должна быть преобразовано в обертку Double, второй будет автоматически боксировал.

+1

Вы не должны использовать 'new Double (...)' вообще. Пожалуйста, используйте привычку 'Double.valueOf (...)', поскольку это позволит Java повторно использовать существующие объекты. Конечно, это еще более важно для маленьких целых чисел или длин. –

+0

@MichaelPiefel Это зависит от реализации или я что-то упускаю? Кажется, что 'Double.valueOf (double d)' просто вызывает новый 'Double (double d)' под обертками. – Thihara

+0

Это правильно (для моего Oracle JDK) - но это просто _might_ будет лучше, как там говорится. Фактически он реализован для целых чисел и длин от 1288 до 127. Интересно, действительно ли существует реализация, которая кэширует больше и действительно ли она эффективнее. –

3

Я думаю, что ваш Rectangle.getWidth() возвращает double. Это не объект-оболочка, как Double, поэтому оператор-точка не может использоваться.

Если бы это было: Double getWidth() вместо double getWidth()

тогда rec1.getWidth().compareTo(rec2.getWidth()); был бы действительным.

How to compare doubles in Java?

+0

Думаю, я понимаю сейчас, спасибо! – user2760309

5

Для сравнения двух double примитивов:

Java старой школы:

return new Double(rec1.getWidth()).compareTo(new Double(rec2.getWidth()); 

Java 1,4 года:

return Double.compare(rec1.getWidth(), rec2.getWidth()); 
+1

+1 для добавления новой версии Java7, которая намного эффективнее, чем создание Double wrappers. – user949300

+1

Можете ли вы объяснить или указать, почему это другое? –

+0

В то время как второй намного чище и предпочтительнее, он действительно эффективнее? – Thihara