从ArrayList

时间:2017-09-27 14:37:23

标签: java object arraylist foreach

理想情况下,我不希望它是静态的或无效的。这是我现在能够让它工作的唯一方法。

我有一个Shape超类。它有一个area()方法,我在Rectangle类和Circle类中使用@Override。在我使用File IO的主要方法中。我试图创建一个方法迭代我的形状的ArrayList,找到最大的区域()。

当我尝试不同的事情时,我会遇到几个不同的错误。当我尝试类似的东西时,Shape large = largest.get(0).area();我收到一个错误,说我无法将双精度转换为形状。

我希望能够从我的arrayList中获取一个区域,然后将其与该ArrayList中的其他区域进行比较,然后执行sort方法以找到最大值并存储并返回它。此外,当我尝试返回它不会让我,因为它不是静态的。

但我不能让我的其他方法保持静态,这不是设计的一部分。 以下是我一直尝试使用foreach的方法,我知道这是不对的,但我可以使用它吗?我怎样才能存储我创建的对象而不是每次都覆盖它?

如果上传的代码更多,请告诉我们。

爪哇

public static void shapeWithLargestArea(ArrayList<Shape> shapes) {

     for(Shape e: shapes) {
         double largest = e.area();
           if (e.area() > largest) {
               largest = e.area();
           }
            System.out.println(largest);
     } // end for each loop


} // end largest area method 

2 个答案:

答案 0 :(得分:1)

您的代码无法使用Shape largest = largest.get(0).area();进行编译,因为您的area()方法会返回double,并且您尝试输入一个带Shape的变量。

你可以实现这个

public static Shape shapeWithLargestArea(ArrayList<Shape> shapes) {
    Shape largestShape = null;
    for(Shape shape: shapes) {
        if(largestShape == null || shape.area() > largestShape.area())
            largestShape = shape;
    } 
    return largestShape;
}

但在java 8中,我认为你可以使用流编写更优雅的代码

在Shape类中编写一个内部比较器类:

private static class ShapeAreaComparator implements Comparator<Shape> {
    @Override
    public int compare(Shape s1, Shape s2) {
        return s1.area().compareTo(s2.area());
    }
}

并在类的静态方法中使用它,如

public static Shape shapeWithLargestArea(ArrayList<Shape> shapes) {
    return shapes.stream().max(new ShapeAreaComparator()).get();
}

但是你的area()方法必须返回Double而不是double才能使用compareTo()方法

答案 1 :(得分:-1)

在循环之前将最大的声明移动到每次都不会覆盖它:

public static Shape shapeWithLargestArea(List<Shape> shapes) {
    Shape largest = shapes.get(0);
    for(Shape e: shapes) {         
        if (e.area() > largest.area()) {
            largest = e;
        }           
    }
    System.out.println(largest.area());
    return largest;
} 

或使用list.stream:

public static Shape shapeWithLargestArea2(List<Shape> shapes) {
    Shape largest = Collections.max(shapes, Comparator.comparing(i -> i.area()));
    System.out.println(largest.area());
    return largest;
}