2013-08-30 3 views
0

Этот класс содержит список Rectangles, и мне нужно найти прямоугольник с наименьшей площадью.Как сравнить два двойных числа и найти smaler

Я нашел, что нужно сравнить прямоугольники по площади, но имеет двойную точность. Я понимаю, что мое сравнение помнит последний, но как мы можем это проверить здесь?

Код:

/** 
    * Gets the Rectangle with the smallest area 
    * @return the rectangle with the smallest area or null if 
    * there are no rectangles 
    */ 
    public Rectangle smallestArea() 
    {   
     if (list.size() == 0) return null; 

     Rectangle smallest = list.get(0);   
     double smallestArea = smallest.getWidth() * smallest.getHeight(); 

     for (int i = 1; i < list.size(); i++) { 
      Rectangle next = list.get(i); 
      double nextArea = next.getWidth() * next.getHeight(); 

      if ((nextArea - smallestArea) < 0) smallest = next;    
     } 

     return smallest; 
    } 

Как решить эту проблему?

+1

Почему бы вам не попробовать простые сравнительные операторы? – rptwsthi

+0

@rptwsthi это не сработало правильно –

+0

Как насчет реализации сопоставимых в вашем классе прямоугольников? – misserandety

ответ

1

Вы должны обновить smallestArea локальную переменную, а также (одна строка больше в вашем коде):

public Rectangle smallestArea() 
    {   
     if (list.size() == 0) return null; 

     Rectangle smallest = list.get(0);   
     double smallestArea = smallest.getWidth() * smallest.getHeight(); 

     for (int i = 1; i < list.size(); i++) { 
      Rectangle next = list.get(i); 
      double nextArea = next.getWidth() * next.getHeight(); 

      if ((nextArea - smallestArea) < 0) { 
      smallest = next;   // <- Whenever you've updated smallest   
      smallestArea = nextArea; // <- Do not forget updating the smallestArea as well 
      } 
     } 

     return smallest; 
    } 
0

Я бы

double smallest = Double.POSITIVE_INFINITY; 

// in the loop. 
if (smallest > next) 
    smallest = next; 
1

Ваш алгоритм не работает, потому что вам нужно обновить smallestArea, как скважина:

if ((nextArea - smallestArea) < 0) { 
    smallest = next; 
    smallestArea = nextArea; // <<== Here 
} 

Отметьте, что (nextArea - smallestArea) < 0 это еще один способ сказать nextArea < smallestArea, так это выглядит чище:

if (nextArea < smallestArea) { 
    smallest = next; 
    smallestArea = nextArea; 
} 
0

Кроме того, помня, что smalles прямоугольник, вы также должны помнить, что размер его есть. Изменение if внутри цикла:

if (nextArea < smallestArea) { 
    smallest = next; 
    smallestArea = nextArea 
} 
0
public Rectangle smallestArea() 
{   
    if (list.size() == 0) return null; 

    Rectangle smallest = list.get(0);   
    double smallestArea = smallest.getWidth() * smallest.getHeight(); 

    for (int i = 1; i < list.size(); i++) { 
     Rectangle next = list.get(i); 
     double nextArea = next.getWidth() * next.getHeight(); 

     if ((nextArea - smallestArea) < 0){ 
      smallest = next;    
      smallestArea = nextArea; 
     } 
    } 

    return smallest; 
} 
-1

Try,

int retval = Double.compare(nextArea, smallestArea); 

if(retval < 0) 
{ 
    System.out.println("smallestArea is greater than nextArea"); 
    smallest = next; 
} 
+0

Использование 'Double.compare' просто потому, что вы хотите проверьте, какой из двух значений «double» меньше, излишне сложно. Просто используйте '<', чтобы сравнить их. Кроме того, это не проблема в коде nazar_art. – Jesper

+0

@ Jesper Спасибо за ваше внимание – newuser

0

Что об этом? Я думаю, вы можете попробовать таким образом

List<Rectangle> list=new ArrayList<>(); 
    List<Double> areaList=new ArrayList<>(); 
    for(Rectangle r:list){ 
     areaList.add(r.getHeight()*r.getHeight()); 
    } 
    Collections.sort(areaList); 
    System.out.println("Smallest "+areaList.get(0));