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