请注意:
我之前创建了一个帖子,并与其他几个帖子一起讨论了这个问题,但是有人告诉我,既然我在同一帖子中问了很多问题,最好将其分解为单个问题。因此,请不要将其标记为重复,是的,说明是相同的,并且使用的是相同的代码,但是问题本身是不同的。谢谢。

我正在按照以下说明操作程序:


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

area = (2 + 4/square root of 2) * side * side

  
  编写程序(驱动程序)以从文件中读取一系列值,显示面积和周长,创建副本并比较对象及其副本(基于面积)。此外,您的程序应将当前对象(刚刚读入)与第一个读入对象进行比较。当从文件中读取负数时,程序结束。


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

public abstract class GeometricObject {

    public abstract double getArea();
    public abstract double getPerimeter();
}


我的Octagon课:

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 {
    }
}


我的Driver或测试人员课程:(这是我需要最多帮助的地方)

import java.util.*;
import java.io.*;

public class Driver {
    public static void main(String[] args) {
        int comparisson = compareTo(octagon);
        java.io.File file = new java.io.File("prog7.dat");
        Scanner fin = new Scanner(file);

        while(fin.hasNext()) {
            double side = fin.nextDouble();
                if(side < 0.0) break;
            Octagon first = new Octagon(side);
            System.out.println("Octagon 1: " + first);

        }

    }
}


这是用于获取输入的文件。每行是一个八边形:

5.0
7.5
3.26
0.0
-1.0


我在设置compareTo()方法时遇到问题。在阅读文档并对其工作原理有大致了解的同时,我从没使用过此工具,但在弄清楚如何将其实现到我的特定程序时遇到了麻烦。

同样,我知道compareTo()方法根据当前对象是较小,较大还是等于要与之比较的对象返回-1、0或1的整数值。但是,从示例输出中可以看到,我不显示此整数值,而是显示类似“第一个较小”的内容。我很确定要这样做,我需要将返回值分配给变量,然后使用if语句确定应打印的内容,但是我在弄清楚应该如何以及在代码的什么点上遇到困难?

最佳答案

根据您要求的这一行:In addition, your program should compare the current object (just read in) with the first object read in.这是一些执行此操作的代码。基本上,这将读取Octagon直到读取负数,然后将每个与读取的第一个Octagon进行比较。

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();
}

10-04 23:34