gpt4 book ai didi

java - 记住从 Java 文件中读取的第一个值

转载 作者:太空宇宙 更新时间:2023-11-04 06:37:44 25 4
gpt4 key购买 nike

请注意:我之前创建了一个帖子,其中包含这个问题以及其他几个问题,但被告知由于我在同一篇帖子中提出了很多问题,因此最好将其分解为单独的问题。因此,请不要将其标记为重复,是的,说明是相同的,是的,正在使用相同的代码,但问题本身是不同的。谢谢。

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

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

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

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

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

public abstract class GeometricObject {

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

我的八角形类(class):

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

还有我的驱动程序或测试人员类(class):(这是我最需要帮助的地方)

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

这是我遇到的问题。

我无法弄清楚如何创建对象。输出应该看起来像这样:

对象 1:面积:120.71 周长:40.0 克隆比较:相等 第一次比较:相等

对象 2:面积:271.60 周长:60.0 克隆比较:相等 第一次比较:第一个较小

因此,我试图弄清楚如何以第一个对象存储在其自己的变量中(因为它将用作其余对象的比较)、克隆并与自身进行比较并打印出正确信息的方式创建对象,然后根据文件中的下一个数字创建下一个对象,克隆它,将其与第一个对象进行比较,并打印信息,然后继续执行此操作,直到文件中达到负数。我希望这是有道理的,我知道我在想什么,只是不知道如何用语言表达哈。

最佳答案

要保留对第一个 Octagon 的引用,您可以尝试两种方法。您可以使用一个标志来指示您是否已经看过第一个:

Octagon first;
boolean seenFirst = false;

while (fin.hasNext()) {
double side = fin.nextDouble();
if (side < 0.0) break;
Octagon octagon = new Octagon(side);
if (!seenFirst) {
first = octagon;
seenFirst = true;
}
// ... do stuff with octagons
}

您甚至可以使用 first 来跟踪它是否已设置:

Octagon first = null;

while (fin.hasNext()) {
double side = fin.nextDouble();
if (side < 0.0) break;
Octagon octagon = new Octagon(side);
if (first == null) {
first = octagon;
}
// ... do stuff with octagons
}

或者,您可以采取不同的方法。您可以在循环开始之前读取第一个 Octagon,而不是在 while 循环中添加条件代码:

Octagon first;

if (fin.hasNext()) {
double side = fin.nextDouble();
if (side < 0.0) return; // return instead of break to exit from main()
first = new Octagon(side);
doStuffWithOctagons(first, first);
}

while (fin.hasNext()) {
double side = fin.nextDouble();
if (side < 0.0) break;
Octagon octagon = new Octagon(side);
doStuffWithOctagons(first, octagon);
}

我已将 doStuffWithOctagons 制作为一种采用第一个八边形和当前八边形的方法,以免在两个位置重复使用八边形执行其余操作的代码。请注意,对于第一个八边形,我将 first 作为 both 参数传递给它。我不确定当您刚刚读取第一个八边形时,您是否真的想要执行将当前八边形与第一个八边形进行比较的步骤。这似乎是多余的,因为它们显然会比较相等,但我无法从你的问题中完全判断你是否确实想这样做。

曾经有一段时间,我更喜欢以前的代码,在 while 循环中使用 if 语句来以不同的方式处理第一种情况。现在我可能更喜欢后一种代码,因为它更清晰、更明确,尽管更长。

关于java - 记住从 Java 文件中读取的第一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25128128/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com