从类型对象的arrayList获取最大卷

时间:2014-05-28 02:54:04

标签: java arraylist comparable

好的,所以我创建了一个实现类似

的类
 public abstract class Shape3D implements Comparable<Shape3D>
 {
private String type;
public double radious;
public double height;

public Shape3D(){

}
protected Shape3D(String type){
    this.type = type;
}

public String getType() {
    return type;
}

public void setType(String type) {
    this.type = type;
}



public abstract double area();

public abstract double volume();

public int compareTo(Shape3D o) {
    double volume1 = this.volume();
    double volume2 = o.volume();
    if (volume1 > volume2){
        return 1;
    }
    else if (volume1 < volume2){
        return -1;
    }
    else {
        return 0;
    }
}
public int compareTo2(Shape3D o) {
    double area1 = this.area();
    double area2 = o.area();
    if (area1 > area2){
        return 1;
    }
    else if (area1 < area2){
        return -1;
    }
    else {
        return 0;
    }
}


     }

两个类将从这个Cylinder和Pyramid扩展而来,我有一个类读取文件并返回文件数组

     import java.io.File;
     import java.io.FileNotFoundException;
     import java.util.ArrayList;
     import java.util.Scanner;

      public class ShapeReader {
private File inputFile;


public ShapeReader(){

}

      public ShapeReader(File inputFile){
this.inputFile = inputFile;
     }





      public ArrayList<Shape3D> readShapes(){
ArrayList<Shape3D> shapes = new ArrayList<Shape3D>();

 try {
     inputFile = new File("shapes3D.txt");
     Scanner sc = new Scanner (inputFile);



     while(sc.hasNextLine()){
         String type = sc.nextLine();
        if (type.contains("Pyramid")){
            String[] data = type.split(",");
             Pyramid p = new Pyramid();
             p.setType(data[0]);
             p.setBase(Double.parseDouble(data[1]));
             p.setHeight(Double.parseDouble(data[2]));
             p.setSlant(Double.parseDouble(data[3]));
             shapes.add(p);

        }
         else if (type.contains("Cylinder")){
             String[] data = type.split(",");
             Cylinder c = new Cylinder();
             c.setType(data[0]);
             c.setRadious(Double.parseDouble(data[1]));
             c.setHeight(Double.parseDouble(data[2]));
             shapes.add(c);


         }



     }
 } catch (Exception e) {
     e.printStackTrace();

 }
 return shapes;
      }
      }

现在在具有主要方法的类上我有这个方法

      public Shape3D maxVolume(ArrayList<Shape3D> shapes ){


    Shape3D currentMax;
   int currentMaxIndex = 0;  
   for ( int i = 1; i < shapes.size(); i++)  
   {  
currentMax = shapes.get(i);  
currentMaxIndex = i;  
if(currentMax.compareTo(shapes.get(i)) < 0)  
      {  
       currentMax = shapes.get(i);  
      currentMaxIndex = i;  
      }  
      }  
      return currentMaxIndex;  
}

但是它给了我一个错误:类型不匹配:无法从int转换为Shape3D如何解决这个问题,我试着给你们尽可能多的详细信息

2 个答案:

答案 0 :(得分:0)

您的maxVolume()方法的声明返回类型为Shape3D,但您将返回currentMaxIndex int。也许你的意思是返回currentMax

此外,只是为了解决您的下一个问题,您需要在for循环中分配currentMaxcurrentMaxIndex两次,比较之前和之后一次。这意味着您将始终将每个元素与自身进行比较,而不是当前最大值。

您需要在for循环之前将currentMax设置为某个最小值,以便它始终比第一个元素小。

答案 1 :(得分:0)

您将方法声明为public Shape3D maxVolume(ArrayList<Shape3D> shapes ),即返回类型为Shape3D。但是,您实际上正在返回int,即currentMaxIndex。这是导致错误的原因。

您可以将返回值更改为shapes.get(currentMaxIndex)以解决问题。