2015-10-13 3 views
0

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

private static int findPositionLargestObject(ArrayList <GeometricObject> geoList) { 
    int maxIndexC = 0; 
    int maxIndexR = 0; 
    for (GeometricObject o: geoList) { 
     for (int i = 1; i < geoList.size(); i++) { 
      if (o instanceof Rectangle) { 
       if (((Rectangle) geoList.get(i)).getArea() > ((Rectangle) geoList.get(maxIndexR)).getArea()) { 
        maxIndexR = i; 
       } 
      } 
      if (o instanceof Circle) { 
       if (((Circle) geoList.get(i)).getArea() > ((Circle) geoList.get(maxIndexC)).getArea()) { 
        maxIndexC = i; 
       } 
      } 

     } 
    } 
    if (maxIndexC > maxIndexR) { 
     return maxIndexC; 
    } else return maxIndexR; 
} 

Однако, когда я запускаю этот метод, я получаю сообщение об ошибке прямоугольник не может быть приведен к кругу. Моя причина иметь два разных оператора if, потому что методы getArea различны для объектов окружности и прямоугольника соответственно. Любые идеи, почему я получаю это сообщение, спасибо!

Вот мой общественный класс

public class hw2redo 
{ 
    public static void main(String[] args) throws FileNotFoundException { 

      GeometricObject g = null; 
      File diskFile = new File("file.txt"); 
      Scanner diskScanner = new Scanner(diskFile); 
      ArrayList<GeometricObject> list = new ArrayList<GeometricObject>(); 
      while(diskScanner.hasNext()){ 
       String geolist = diskScanner.nextLine(); 
       g = recreateObject(geolist); 

       list.add(g); 

      } 
      diskScanner.close(); 
     /* while (diskScanner.hasNext()) { 
       String list = diskScanner.nextLine(); 
       g = recreateObject(list); 
      } 
      diskScanner.close();*/ 
      showObjects(list); 
      findPositionLargestObject(list); 
     } 





    private static GeometricObject recreateObject(String data) { 

      String[] list = data.split(","); 
      String geoObject = list[0]; 

      if (geoObject.equals("Circle")) { 
      String color = list[1]; 
      boolean filled = Boolean.valueOf(list[2]); 
      double radius = Double.valueOf(list[3]); 
      return new Circle(radius, color, filled); 
      } 

      if (geoObject.equals("Rectangle")) { 
      String color = list[1]; 
      boolean filled = Boolean.valueOf(list[2]); 
      double height = Double.valueOf(list[3]); 
      double width = Double.valueOf(list[4]); 
      return new Rectangle(width, height, color, filled); 
      } 
     return null; 


     } 

    private static void showObjects(ArrayList<GeometricObject> list) { 

     for(GeometricObject o : list) { 

      if (o instanceof Circle) 
      { 
      System.out.println(o); 
      ((Circle) o).printCircle(); 
      System.out.println(""); 
      } 
      if (o instanceof Rectangle) 
      { 
      System.out.println(o); 
      ((Rectangle) o).printRectangle(); 
      System.out.println(""); 
      } 
     } 
    } 
     private static int findPositionLargestObject(ArrayList<GeometricObject> geoList) { 

      int maxIndexC = 0; 
      int maxIndexR = 0; 
      for(GeometricObject o : geoList) 
      { 
      for (int i = 1; i < geoList.size(); i++) { 
       if (o instanceof Rectangle) 
       { 
       if (((Rectangle) geoList.get(i)).getArea() > ((Rectangle) geoList.get(maxIndexR)).getArea()) { 
        maxIndexR = i; 
       } 
       } 
       if (o instanceof Circle) 
       { 
       if (((Circle) geoList.get(i)).getArea() > ((Circle) geoList.get(maxIndexC)).getArea()) { 
         maxIndexC = i; 
       } 
       } 

      } 
     } 
      if (maxIndexC > maxIndexR) 
      { 
       return maxIndexC; 
      } 
      else 
       return maxIndexR; 
    } 
} 

ответ

0

Вы проверяете o, является ли экземпляр Rectangle/Circle, но литье geoList.get(i) к соответствующему типу вместо этого. Фактически, o не используется нигде в цикле, кроме instanceof чеков.

2

Вы дважды перебираете свой массив для каждого объекта.

for (GeometricObject o: geoList) { // for each GeometricObject in geoList, 
    for (int i = 1; i < geoList.size(); i++) { // loop through each object in geoList. 

Удалите либо петлю for-each, либо обычный цикл.

0

Из того, что я мог понять, у вас было бы два класса, Rectangle и Circle, простирающиеся от некоторого общего класса, называемого Geometry, в конце. Важно отметить, что Rectangle и Circle будут братьями и сестрами. Это Прямоугольник никогда не является Кругом и наоборот. Прямым следствием этого утверждения является то, что вы не можете рассматривать экземпляр Rectangle, как если бы это был экземпляр Circle и наоборот.

В вашем методе findPositionLargestObject вы maxIndexC и maxIndexR инициализируется 0. Хотя это звучит безобидно, вниз по линии вы делаете что-то вроде этого:

  if (o instanceof Rectangle) 
      { 
      if (((Rectangle) geoList.get(i)).getArea() > ((Rectangle) geoList.get(maxIndexR)).getArea()) { 

// Что является гарантией того, что maxIndexR, что ' 0 ', имеет прямоугольник, а не круг. maxIndexR = i; }} , если (о InstanceOf Circle) { , если (((круг) geoList.get (я)). GetArea()> ((круг) geoList.get (maxIndexC)). GetArea()) { // Какова гарантия того, что maxIndexC, который является «0» изначально, содержит круг, а не прямоугольник ?. maxIndexC = i; } }

Несомненно, там есть какая-то ошибка. Кроме того, если у вас есть только два вида геометрии, вы можете использовать if else вместо двух if clauses. Это было бы более доказательством ошибок.

2

Поскольку нет кода предусмотрено GeometricObject, но я предполагаю, что getArea() определяется в некотором роде в GeometricObject, так почему даже использовать бросок, если вы можете просто оценить его непосредственно:

int max_circle , area_circle; 
int max_rect , area_rec; 

for(int i = 0 ; i < geoList.size() ; i++){ 
    GeometricObject go = geoList.get(i); 

    if(go instanceof Rectangle) 
     if(go.getArea() > area_rec){ 
      area_rec = go.getArea(); 
      max_rect = i; 
     }else{ 
      area_circle = go.getArea(); 
      max_circle = i; 
     } 
} 

причина, почему ваш код бросает исключение:

((Rectangle) geoList.get(maxIndexR)) 

с maxIndexR инициализируется 0, а так же для кругов.Таким образом, если первый элемент в geoList равен Rectangle, первый круг вызовет вызов ((Circle) geoList.get(0)), но первым элементом является Rectangle. То же самое относится и к другому. Если вы хотите сохранить свой код, просто добавьте еще одну переменную для хранения максимальных областей обоих кругов и прямоугольников и просто используйте значения (инициализированные до 0) вместо того, чтобы извлекать фигуру из списка и отбрасывать ее.

+0

My GeometricObject фактически не имеет метода getArea(). Мое рассуждение о том, как было бы знать, нужно ли извлекать область круга или прямоугольников, потому что они требуют разных формул? –

+1

@RiFFRAFF, который можно решить довольно просто, используя абстрактные методы (http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html). Хотя вы можете просто использовать второе решение, если вы не хотите изменять код 'GeometricObject'. – Paul

+0

Ну, мой класс GeometricObject является абстрактным, и мой класс Circle и Rectangle расширяет его, я до сих пор не вижу, как я могу рассказать о методе getArea моего геометрия, который я пытаюсь использовать. –

Смежные вопросы