【发布时间】:2020-01-23 00:01:24
【问题描述】:
我创建了多个类,我想做的一部分是创建一个太阳系并允许用户输入有关行星的信息并不断将它们添加到数组列表中,当他们完成添加行星时,显示他们的摘要太阳系。 我想根据他们输入的轨道半径显示哪个行星最接近太阳。因此,为了使这更容易,我决定创建一个 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);
创建新星球后。
【问题讨论】:
-
代码的哪一部分控制用户输入?
-
如果用户添加的行星没有被添加到列表中,那么您可能会将它们添加到 差异
SolarSystem实例中。不过,如果没有看到那部分代码,我们无法确定。 -
您的
addPlanet()方法有缺陷。如果新的Planet不是第一颗行星,并且它的轨道比所有现有行星都大,那么您的代码将在i = solarSystem.size()时导致IndexOutOfBoundsException。如果您将<=更改为<以防止异常,则根本不会添加新行星。 --- 也许这就是正在发生的事情,而您正在捕捉并忽略异常? -
@PM77-1 我刚刚包含了用户输入客户端类
-
@Andreas 在我的客户端代码中,我只创建了一个 solarSystem 实例,所以我不确定新行星还添加到了哪里。
标签: java class arraylist user-input