2015-10-13 32 views
0

所以我想寫一個方法,將返回最大面積的對象的索引。這是我目前的方法矩形不能轉換爲Circle?

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)到相應類型來代替。實際上,除了instanceof檢查外,o不在循環中的任何位置使用。

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循環或for循環。

0

從我所能理解的,你會有兩個類,矩形和圓從一些常見的類擴展名爲幾何在你的最後。這裏需要注意的一點是Rectangle和Circle是兄弟姐妹。這是一個矩形從來不是一個圓,反之亦然。這個陳述的直接結果是你不能把Rectangle實例看作是一個Circle實例,反之亦然。

在你的方法findPositionLargestObjectmaxIndexCmaxIndexR初始化爲0。雖然這聽起來很無害的,下了線,你做這樣的事:

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

//什麼是保證maxIndexR,這就是「 0'最初,擁有一個矩形而不是一個圓圈。 maxIndexR = i; } } 如果(鄰的instanceof圓) { 如果(((圓)geoList.get(I))。的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類擴展它,我仍然沒有看到我能夠告訴我的GeometricObject的getArea方法我試圖使用哪一個。 –