理想情况下,我不希望它是静态的或无效的。这是我现在能够让它工作的唯一方法。
我有一个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
答案 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;
}