Java 为什么findMax方法会给出数组第一个元素的结果,而不是最大元素的结果?

Java 为什么findMax方法会给出数组第一个元素的结果,而不是最大元素的结果?,java,arrays,Java,Arrays,我尝试使用静态findMax方法查找周长最大的矩形。不知何故,它只给出了我在数组中生成的矩形,而不是具有最大周长的数组。我不知道出了什么问题,因为我推翻的compareTo方法似乎运行良好 下面是矩形类的代码: public class Rectangle implements Comparable<Rectangle> { private double length; private double width; private double peri

我尝试使用静态findMax方法查找周长最大的矩形。不知何故,它只给出了我在数组中生成的矩形,而不是具有最大周长的数组。我不知道出了什么问题,因为我推翻的compareTo方法似乎运行良好

下面是矩形类的代码:

public class Rectangle implements Comparable<Rectangle> {
    private double length;
    private double width;
        private double perimeter;


    public Rectangle(double l, double w){
        this.length = l;
        this.width = w;
    } 

    public  double getLength() {
        return length;
    }

    public  double getWidth(){
        return width;
    }

        public void setLength(double l){
            length= l;
        }
        public void setWidth(double w){
            width = w;
        }

    public double getPerimeter(){
               perimeter = 2*(length+width);

               return perimeter;
    }




        @Override
    public int compareTo(Rectangle other){
               return Double.compare(this.perimeter, other.perimeter);
        }

        @Override
        public String toString(){
            return "Rectangle: "+ width +" by "+ length ;
        }




}
公共类{
私人双倍长度;
私人双宽度;
私人双周界;
公共矩形(双l,双w){
这个长度=l;
这个宽度=w;
} 
公共双getLength(){
返回长度;
}
公共双getWidth(){
返回宽度;
}
公共空间设置长度(双l){
长度=l;
}
公共空间设置宽度(双w){
宽度=w;
}
公共双边界{
周长=2*(长度+宽度);
返回周长;
}
@凌驾
公共整数比较(矩形其他){
返回Double.compare(this.period,other.period);
}
@凌驾
公共字符串toString(){
返回矩形:“+宽度+”乘以“+长度;
}
}
这是findMax的主要功能:有点混乱,因为我正在测试

public class Problem1{

    public static <Anytype extends Comparable<Anytype>> Anytype findMax(Anytype[] arr){
                int maxIndex = 0;
        for (int i = 1; i < arr.length; i++)
                if ( arr[i].compareTo(arr[maxIndex]) > 0 )
                            maxIndex = i;
            return arr[maxIndex];
        }


              public static void main(String[] args){

        Rectangle[] arr = new Rectangle[5];

        for(int i = 0; i < 5; i++)
        {
         Rectangle r = new Rectangle(10, 20);
         r.setWidth((Math.random()*10)+10); 
         r.setLength((Math.random()*10)+10);

         arr[i] = r;
        }

               // Rectangle max = findMax(<Rectangle>[] arr);

                Rectangle max = findMax(arr);
                double maxP =max.getPerimeter();
                System.out.println( "The rectangle that has the max perimeter is "+findMax(arr)+" maxP is "+maxP);
                for(Rectangle rec: arr){
                    System.out.println(rec.getPerimeter());
                    System.out.println(rec);


                }

    }


}
公共类问题1{
公共静态Anytype findMax(Anytype[]arr){
int maxIndex=0;
对于(int i=1;i0
maxIndex=i;
返回arr[maxIndex];
}
公共静态void main(字符串[]args){
矩形[]arr=新矩形[5];
对于(int i=0;i<5;i++)
{
矩形r=新矩形(10,20);
r、 setWidth((Math.random()*10)+10);
r、 setLength((Math.random()*10)+10);
arr[i]=r;
}
//矩形最大值=findMax([]arr);
矩形最大值=findMax(arr);
double maxP=最大GetPermiture();
System.out.println(“具有最大周长的矩形为“+findMax(arr)+”maxP为“+maxP”);
用于(矩形rec:arr){
System.out.println(rec.getPermission());
系统输出打印项次(rec);
}
}
}

您没有调用GetPeriod()来设置对象的周长,因此周长将有一个默认值0,我建议您编辑compareTo以在其主体中调用GetPeriod方法,如下所示:

public int compareTo(Rectangle other){
    return Double.compare(this.getPerimeter(), other.getPerimeter());
} 
更改报税表:

return Double.compare(this.getPerimeter(), other.getPerimeter());

您的
compareTo
方法使用字段
periment
,该字段仅在调用
getperiment()
后初始化。我建议取消该字段,只使用
getperiment()
(它将始终根据
宽度
高度
字段返回正确的周长)。或者您可以在长度/宽度设置器中更新
周长
。您可以按照此处的建议更新代码的getter和setter-您已经创建了5个矩形设置长度和宽度的对象,但周长没有在任何位置设置,因此每个矩形的周长都将为0.0(默认值)。所以我建议在构造函数中初始化周长,如下所示:this.permiture=2(this.length*this.width);是的,你是对的,谢谢,相应地更新了我的答案。请包括一些解释,说明为什么这些更改可能有助于OP
return Double.compare(this.getPerimeter(), other.getPerimeter());