Обратите внимание: я создал сообщение ранее, у которого был этот вопрос вместе с несколькими другими, но мне сказали, что, поскольку я задавал столько вопросов в одном и том же сообщении, было бы лучше разбить его на отдельные вопросы. Поэтому, пожалуйста, не отмечайте это как дубликат, да, инструкции одинаковы и да, тот же код используется, но сам вопрос отличается. Благодарю.
Я работаю над программой со следующими инструкциями:
Напишите класс 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 в зависимости от того, является ли текущий объект меньшим, большим или равным объекту, с которым он сравнивается. Однако, как вы можете видеть из примера output, вместо того, чтобы отображать это целочисленное значение, я должен отображать что-то вроде "Первое меньше". Я уверен, что это нужно, мне нужно было бы присвоить возвращаемое значение переменную, а затем использовать инструкции 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();
}
System.out.print
иметь oct.toString()
вместо того , чтобы просто oct
.) Тем не менее, я не знаю , почему вы с этой проблемой , так как вы сделали перегрузку Object.toString()
.
int compareTo (Object o)
или
int compareTo (String anotherString)
public class Test {
public static void main(String args[]) {
String str1 = "Strings are immutable";
String str2 = "Strings are immutable";
String str3 = "Integers are not immutable";
int result = str1.compareTo( str2 );
System.out.println(result);
result = str2.compareTo( str3 );
System.out.println(result);
result = str3.compareTo( str1 );
System.out.println(result);
}
}
Это дает следующий результат:
0
10
-10
Также вы можете проверить → http://www.javapractices.com/topic/TopicAction.do?Id=10
compareTo()
не должно возвращать только-1
,0
или1
. Он просто должен вернуть отрицательное значениеint
,0
или положительное значениеint
.