[英]Why does Java's Stream.reduce method take an identity element instead of a default result?
[英]Why does my findMax method gives me the result of the first element of an array instead of the maximum element?
我正在尝试使用静态 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 ;
}
}
这是具有 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);
}
}
}
您没有调用 getPerimeter() 来设置对象的周长,因此周长将具有默认值 0,我建议您编辑 compareTo 以在其主体中调用 getPerimeter 方法,如下所示:
public int compareTo(Rectangle other){
return Double.compare(this.getPerimeter(), other.getPerimeter());
}
@Override
public int compareTo(Rectangle other){
System.out.println(this.perimeter + " :: " + other.perimeter);//all 0.0 :: 0.0
return Double.compare(this.perimeter, other.perimeter);
}
改变回报:
return Double.compare(this.getPerimeter(), other.getPerimeter());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.