Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从ArrayList中查找各种形状对象的最大面积_Java_Object_Arraylist_Foreach - Fatal编程技术网

Java 从ArrayList中查找各种形状对象的最大面积

Java 从ArrayList中查找各种形状对象的最大面积,java,object,arraylist,foreach,Java,Object,Arraylist,Foreach,理想情况下,我不希望它是静态的或空的。这是目前我唯一能让它工作的方法 我有一个形状超类。它有一个area()方法,I@在Rectangle类和Circle类中重写该方法。在我的主要方法中,使用文件IO。我正在尝试创建一个方法来迭代我的形状数组列表,以找到最大的区域() 当我尝试不同的事情时,我会犯一些不同的错误。当我尝试这样做时,Shape max=maximust.get(0.area();我收到一个错误,说我不能将双精度转换为形状 我希望能够从我的arrayList中获取一个区域,然后将其与

理想情况下,我不希望它是静态的或空的。这是目前我唯一能让它工作的方法

我有一个形状超类。它有一个area()方法,I@在Rectangle类和Circle类中重写该方法。在我的主要方法中,使用文件IO。我正在尝试创建一个方法来迭代我的形状数组列表,以找到最大的区域()

当我尝试不同的事情时,我会犯一些不同的错误。当我尝试这样做时,Shape max=maximust.get(0.area();我收到一个错误,说我不能将双精度转换为形状

我希望能够从我的arrayList中获取一个区域,然后将其与该arrayList中的其他区域进行比较,并使用排序方法找到最大的区域,存储并返回它。而且,当我试图返回它不会让我,因为它不是静态的

但我不能使我的其他方法静态,这不是设计的一部分。 下面是我一直在用foreach尝试的一种方法,我知道这是不对的,但我可以潜在地使用它吗?如何让它存储我创建的对象而不每次都覆盖它

如果更多的代码上传将是有益的,请让我知道

爪哇

publicstaticvoidshapewithlargestarea(arraylistshapes){
用于(形状e:形状){
双最大=e.面积();
如果(如面积()>最大){
最大=e.面积();
}
系统输出打印项次(最大);
}//每个循环结束
}//结束最大面积法

您的代码无法使用
Shape max=max.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;
}
公共静态形状形状Withlargestarea(ArrayList形状){
Shape largestShape=null;
用于(形状:形状){
if(largestShape==null | | shape.area()>largestShape.area())
最大形状=形状;
} 
返回最大形状;
}
但在Java8中,我认为可以用流编写更优雅的代码

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

private static class ShapeAreaComparator implements Comparator<Shape> {
    @Override
    public int compare(Shape s1, Shape s2) {
        return s1.area().compareTo(s2.area());
    }
}
私有静态类ShapeAreaComparator实现Comparator{
@凌驾
公共整数比较(形状s1、形状s2){
返回s1.area().compareTo(s2.area());
}
}
并在类的静态方法中使用它,如下所示

public static Shape shapeWithLargestArea(ArrayList<Shape> shapes) {
    return shapes.stream().max(new ShapeAreaComparator()).get();
}
公共静态形状形状Withlargestarea(ArrayList形状){
返回shapes.stream().max(新的ShapeAreaComparator()).get();
}

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

在循环之前移动最大的去极化,以避免每次都覆盖它:

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;
} 
公共静态形状形状Withlargestarea(列表形状){
形状最大=形状。获取(0);
对于(形状e:shapes){
如果(e.area()>最大的.area()){
最大=e;
}           
}
System.out.println(最大面积());
回报最大;
} 
或使用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;
}
公共静态形状形状WithlargestareA2(列表形状){
shapemax=Collections.max(shapes,Comparator.comparing(i->i.area());
System.out.println(最大面积());
回报最大;
}

请原谅我的多次编辑,现在我认为它工作得很好。非常感谢你。我喜欢前额痛!我想他想要返回一个形状,而不是一个区域,我想避开list.stream。将声明移出循环仍然会打印每个迭代。它仍然不只是打印最大的一个。把你的系统放出来。在forwe不能帮助你更多你现在有了所有的答案(返回最大的形状或最大的面积)是的Francois我想返回一个形状而不是一个面积。我的第一个评论是针对.net的,所以我已经删除了它。。。但是,您可以实现集合,然后对集合进行排序,以便实现将集合按从最大到最小的顺序进行排序。
public static Shape shapeWithLargestArea2(List<Shape> shapes) {
    Shape largest = Collections.max(shapes, Comparator.comparing(i -> i.area()));
    System.out.println(largest.area());
    return largest;
}