所以我试图编写一个方法来返回具有最大区域的对象的索引。这是我目前的方法
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 :(得分: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循环。
答案 1 :(得分: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),而不是从列表中检索形状并进行投射。
答案 2 :(得分:0)
您正在检查o
是Rectangle
/ Circle
的实例,而是将geoList.get(i)
转换为相应的类型。实际上,除o
项检查外,instanceof
不会在循环中的任何位置使用。
答案 3 :(得分: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()) {
//最初为'0'的maxIndexR保持Rectangle而不是Circle?的保证是什么? maxIndexR = i; } } if(o instanceof Circle) { if(((Circle)geoList.get(i))。getArea()&gt;((Circle)geoList.get(maxIndexC))。getArea()){ //最初为'0'的maxIndexC保持Circle而不是Rectangle的保证是什么? maxIndexC = i; } }
当然有一些谬误。此外,如果您只有两种几何图形,则可以使用if else
而不是两个if clauses
。这将是更多的错误证明。