在Java中设置compareTo()方法

在Java中设置compareTo()方法,java,comparable,compareto,Java,Comparable,Compareto,请注意: 我早些时候写了一篇文章,上面有这个问题和其他几个问题,但有人告诉我,既然我在同一篇文章中问了这么多问题,最好把它分成几个单独的问题。因此,请不要将此标记为重复,是的,说明相同,使用的代码相同,但问题本身不同。谢谢 我正在按照以下说明编写一个程序: 编写一个名为Octagon的类,该类扩展GeometricObject并实现可比较和可克隆的接口。假设八角形的所有8条边大小相等。可使用以下公式计算面积 area = (2 + 4/square root of 2) * side * sid

请注意: 我早些时候写了一篇文章,上面有这个问题和其他几个问题,但有人告诉我,既然我在同一篇文章中问了这么多问题,最好把它分成几个单独的问题。因此,请不要将此标记为重复,是的,说明相同,使用的代码相同,但问题本身不同。谢谢

我正在按照以下说明编写一个程序:

编写一个名为Octagon的类,该类扩展GeometricObject并实现可比较和可克隆的接口。假设八角形的所有8条边大小相等。可使用以下公式计算面积

area = (2 + 4/square root of 2) * side * side 
编写一个程序(驱动程序),从文件中读入一系列值,显示面积和周长,创建克隆并比较对象及其克隆(基于面积)。此外,您的程序应该将当前对象(刚刚读入)与第一个读入的对象进行比较。当从文件中读取负数时,程序结束

这是我到目前为止的代码,这是我的
GeometricObject
类:

public abstract class GeometricObject {
    
    public abstract double getArea();
    public abstract double getPerimeter(); 
}
public class Octagon extends GeometricObject implements Comparable<Octagon> {
    private double side = 1.0;
    protected native Object clone() throws CloneNotSupportedException;
    private static int numberOfObjects = 0; 
    
    public Octagon() {
    }
    
    public Octagon(double side) {
        this.side = side;
        numberOfObjects++;
    }

    public double getSide() {
        return side;
    }

    public void setSide(double side) {
        this.side = side;
    }
    
    public double getArea() {
        return (2 + (4 / (Math.sqrt(2))) * side * side); 
    }
    
    public double getPerimeter() {
        return side * 8;
    }
    
    public String toString() {
        return "Octagon " + numCreated + ": Area: " + getArea() + "\nPerimeter: " 
            + getPerimeter() + "\nClone Compare: " + Cloneable + "\nFirst Compare: "
            + comparisson;
    }
    
    public int compareTo(Octagon octagon) {
        if(getArea() > octagon.getArea()) 
            return 1;
        else if(getArea() < octagon.getArea()) 
                return -1;
        else
            return 0;
    }

    public interface Cloneable {
    } 
}
我的
八角形
类:

public abstract class GeometricObject {
    
    public abstract double getArea();
    public abstract double getPerimeter(); 
}
public class Octagon extends GeometricObject implements Comparable<Octagon> {
    private double side = 1.0;
    protected native Object clone() throws CloneNotSupportedException;
    private static int numberOfObjects = 0; 
    
    public Octagon() {
    }
    
    public Octagon(double side) {
        this.side = side;
        numberOfObjects++;
    }

    public double getSide() {
        return side;
    }

    public void setSide(double side) {
        this.side = side;
    }
    
    public double getArea() {
        return (2 + (4 / (Math.sqrt(2))) * side * side); 
    }
    
    public double getPerimeter() {
        return side * 8;
    }
    
    public String toString() {
        return "Octagon " + numCreated + ": Area: " + getArea() + "\nPerimeter: " 
            + getPerimeter() + "\nClone Compare: " + Cloneable + "\nFirst Compare: "
            + comparisson;
    }
    
    public int compareTo(Octagon octagon) {
        if(getArea() > octagon.getArea()) 
            return 1;
        else if(getArea() < octagon.getArea()) 
                return -1;
        else
            return 0;
    }

    public interface Cloneable {
    } 
}
这是用来获取输入的文件。每条线是一个八角形:

5.0
7.5
3.26
0.0
-1.0
设置
compareTo()
方法时遇到问题。我以前从未使用过它,虽然我已经阅读了文档并对它的工作原理有了大致的了解,但我很难弄清楚如何在我的特定程序中实现它

同样,我知道
compareTo()
方法根据当前对象是否小于、大于或等于要比较的对象,返回-1、0或1的整数值。但是,正如您从示例输出中看到的,我不显示这个整数值,而是应该显示类似“第一个更小”的内容“。我很确定要这样做,我需要将返回值赋给一个变量,然后使用if语句来确定应该打印什么,但我很难确定如何以及在代码中的什么时候执行此操作?

int compareTo(对象o)

int compareTo(字符串另一个字符串)

这将产生以下结果:

0
10
-10

您还可以根据这一行的需求检查->

此外,您的程序应该将当前对象(刚刚读入)与第一个读入的对象进行比较。
下面是一些代码。基本上,它读取八边形,直到读取一个负数,并将每个负数与读入的第一个八边形进行比较

Octagon first = null;
int i = 0;
while(fin.hasNext())
{
    double side = fin.nextDouble();
    if(side < 0.0)
        break;
    Octagon oct = new Octagon(side);
    System.out.print("Octagon " + i + ": \"" + oct.toString() + "\"");
    if (first == null)
        first = oct;
    else
    {
        // Here is where we compare the current Octagon to the first one
        int comparison = oct.compareTo(first);
        if (comparison < 0)
            System.out.print(", less than first");
        else if (comparison > 0)
            System.out.print(", greater than first");
        else System.out.print(", equal to first");
    }
    Octagon first = new Octagon(side);
    System.out.println();
}
Octagon first=null;
int i=0;
while(fin.hasNext())
{
双面=翅片下一个双面();
如果(侧面<0.0)
打破
八角形oct=新八角形(侧面);
System.out.print(“八角形”+i+:\“”+oct.toString()+“\”);
if(first==null)
第一个=十月;
其他的
{
//这里是我们比较当前八角形和第一个八角形的地方
int比较=10月比较(第一);
如果(比较<0)
系统输出打印(“,小于第一个”);
否则如果(比较>0)
系统输出打印(“,大于第一个”);
else系统输出打印(“,等于第一个”);
}
八角形第一=新八角形(边);
System.out.println();
}

compareTo()
不必只返回
-1
0
1
。它只需要返回一个负的
int
0
,或者一个正的
int
。对,我的主要意思是它必须返回一个int,它不是我需要显示的输出。你的
compareTo
函数可以写得更短:
返回Double.compare(getArea(),octagon.getArea())谢谢!我现在唯一的问题是它没有打印面积或周长。输出如下所示:八角形1:“Octagon@134bed0“八角形2:”Octagon@1db4f6f,大于第一个八角形3:Octagon@13c1b02,小于第一个八角形4:Octagon@11121f6,小于第一次检查我的编辑。(我将第一个
System.out.print
更改为具有
oct.toString()
而不是仅具有
oct
)但是,我不确定为什么会出现此问题,因为您确实重载了
对象。toString()
。看起来
toString()
被正确覆盖,但是,如果向其添加
@Override
注释,编译器将告诉您是否犯了一些错误,并且没有正确地重写超类方法。添加oct.toString()修复了该问题。非常感谢。