我创建了多个类,我想做的部分工作是创建一个太阳系,允许用户输入有关行星的信息并不断将它们添加到数组列表中,当他们完成添加行星时,显示其太阳系的摘要。 我想根据他们输入的轨道半径显示哪颗行星离太阳最近。因此,为了简化此操作,我决定创建一个addPlanet((方法,该方法将扫描数组列表并根据轨道半径以正确的顺序添加新行星。
public void addPlanet(Planet p) {
if (solarSystem.size() == 0) { //solarSystem is the array list of planets
solarSystem.add(p);
} else {
for (int i = 0; i <= solarSystem.size(); i++) {
if (p.getOrbital() < solarSystem.get(i).getOrbital()) {
solarSystem.add(i, p);
break;
}
}
}
}
我已经构建了三颗行星,然后提示用户输入其他行星的信息。但是,当我打印太阳系的摘要时,其他用户输入的行星没有显示。 摘要代码为:
System.out.println(solarSystem.toString());
System.out.println("The planet closest to the sun is: " + solarSystem.getClosest());
System.out.println("The total mass of your planets in your solar system is: " + solarSystem.totalMass() + " Earth mass");
这是我完整的太阳系课程
import java.util.*;
public class SolarSystem {
private static ArrayList<Planet> solarSystem;
private String name;
//Create an array list to add planets
public SolarSystem() {
this.solarSystem = new ArrayList<Planet>();
}
//print out the Solar System
public String toString() {
String system = "The solar system: ";
for (Planet n : solarSystem) {
system += n.getName() + " ";
}
return system;
}
public void addPlanet(Planet p) {
if (solarSystem.size() == 0) {
solarSystem.add(p);
} else {
for (int i = 0; i <= solarSystem.size(); i++) {
if (p.getOrbital() < solarSystem.get(i).getOrbital()) {
solarSystem.add(i, p);
break;
}
}
}
}
public String getClosest() {
return solarSystem.get(0).getName();
}
public double totalMass() {
double mass = 0;
for (Planet p : solarSystem) {
mass += p.getMass();
}
return mass;
}
}
它接受用户输入的客户端类是:
import java.util.*;
public class Astronomer {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
SolarSystem solarSystem = new SolarSystem();
Planet earth = new Planet(1, 149.6, 23.5, "Earth", 1);
solarSystem.addPlanet(earth);
System.out.println(earth.toString());
Planet mercury = new Planet(0.055, 41.7, 2.1, "Mercury", 0.24);
solarSystem.addPlanet(mercury);
System.out.println(mercury.toString());
Planet mango = new Planet(0.7, 5.2, "Mango", 0.7);
mango.setOrbital(53.4);
solarSystem.addPlanet(mango);
System.out.println(mango.toString());
System.out.println("The closest planet to the Sun is " + solarSystem.getClosest());
System.out.println("Would you like to add additional planets? ");
String add = scan.next();
while(add.substring(0, 1).equalsIgnoreCase("y")) {
System.out.println("Enter the name of the planet: ");
String name = scan.next();
System.out.println("Enter the mass of the planet in terms of Earth mass: ");
double mass = scan.nextDouble();
System.out.println("Enter the orbital radius in million km: ");
double radius = scan.nextDouble();
System.out.println("Enter the measure of axis tilt in degrees: ");
double axis = scan.nextDouble();
System.out.println("Enter the period of the planet in years: ");
double period = scan.nextDouble();
Planet a = new Planet(mass, radius, axis, name, axis); //how to make it so it creates a new planet and not overwrite planet already created
System.out.println(a.toString());
System.out.println("Would you like to add additional planets? ");
add = scan.next();
}
System.out.println(solarSystem.toString());
System.out.println("The planet closest to the sun is: " + solarSystem.getClosest());
System.out.println("The total mass of your planets in your solar system is: " + solarSystem.totalMass() + " Earth mass");
System.out.println("Goodbye!");
}
}
我如何修复我的代码,以便当用户输入行星时,它实际上被添加到我的行星数组列表中?
解决方案:我忘了添加
solarSystem.addPlanet(a);
在创造新星球之后。
查看添加星球中的逻辑
前面提到的第一件事是 for 循环容易出现IndexOutOfBoundsException
,所以首先将 <= 更改为如下所示的<,原因是 size(( 返回数组中的对象数量,但索引从 0 开始,因此对于包含 3 个对象的数组,最大索引仅为 2。
当你添加新的行星时,你的 if 语句限制额外的行星只在它的轨道较小时才添加该行星,如果它的轨道比所有其他行星都大,它永远不会被添加,我明白你为什么这样做,那就是将行星添加到数组中以使它们保持大小顺序, 但是,如果它也更大,则需要考虑添加。
为此,我建议以下内容,从 if 中删除中断,并将其替换为返回(如果它添加一个行星,该方法不再有任何运行的理由(,然后在 for 循环之后,放入一个 addPlanet 调用,如果该方法仍在运行,它将在末尾添加它。请参阅下面的修改后的代码,希望对您有所帮助。
public void addPlanet(Planet p) {
if (solarSystem.size() == 0) {
solarSystem.add(p);
} else {
for (int i = 0; i < solarSystem.size(); i++) {
if (p.getOrbital() < solarSystem.get(i).getOrbital()) {
solarSystem.add(i, p);
return; // adding planet is complete so we will exit the method here
}
}
// if we're here, the planet must be larger than all others
// so we will add the planet at the end of the array
solarSystem.add(p);
}
}