, поэтому я пытаюсь написать метод, который вернет индекс объекта с наибольшей площадью. Вот мой текущий методПрямоугольник нельзя отнести к кругу?
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;
}
}
My GeometricObject фактически не имеет метода getArea(). Мое рассуждение о том, как было бы знать, нужно ли извлекать область круга или прямоугольников, потому что они требуют разных формул? –
@RiFFRAFF, который можно решить довольно просто, используя абстрактные методы (http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html). Хотя вы можете просто использовать второе решение, если вы не хотите изменять код 'GeometricObject'. – Paul
Ну, мой класс GeometricObject является абстрактным, и мой класс Circle и Rectangle расширяет его, я до сих пор не вижу, как я могу рассказать о методе getArea моего геометрия, который я пытаюсь использовать. –