Обратите внимание: ранее я создал сообщение, в котором был этот вопрос и несколько других, но мне сказали, что, поскольку я задаю так много вопросов в одном и том же сообщении, было бы лучше разбить его на индивидуальные вопросы. Поэтому, пожалуйста, не отмечайте это как дубликат, да, инструкции те же и да, используется тот же код, но сам вопрос другой. Спасибо.
Я работаю над программой со следующими инструкциями:
Напишите класс 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, чтобы определить, что должно быть напечатано, но мне трудно понять, как и в какой момент в моем коде это должно быть сделано?
compareTo()
не должен возвращать только-1
,0
или1
. Он просто должен вернуть отрицательное значениеint
,0
или положительное значениеint
. - person Jashaszun   schedule 05.08.2014compareTo
может быть записана короче:return Double.compare(getArea(), octagon.getArea());
- person fabian   schedule 05.08.2014