【问题标题】:[java]I've created an adding class and it compiles but nothing get's added to the array list[java]我创建了一个添加类,它可以编译但没有任何东西添加到数组列表中
【发布时间】: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。如果您将&lt;= 更改为&lt; 以防止异常,则根本不会添加新行星。 --- 也许这就是正在发生的事情,而您正在捕捉并忽略异常?
  • @PM77-1 我刚刚包含了用户输入客户端类
  • @Andreas 在我的客户端代码中,我只创建了一个 solarSystem 实例,所以我不确定新行星还添加到了哪里。

标签: java class arraylist user-input


【解决方案1】:

查看添加星球中的逻辑

前面提到的第一件事是你的for循环很容易出现IndexOutOfBoundsException,所以首先将

当您添加新行星时,您的 if 语句限制其他行星仅添加具有较小轨道的行星,如果它具有比所有其他行星更大的轨道,则永远不会添加,我明白为什么你已经这样做了,那就是将行星添加到数组中以保持它们的大小顺序,但是如果它也更大,你需要考虑添加。

为此,我建议执行以下操作,从 if 中删除 break,并将其替换为 return(如果它添加了行星,则该方法不再有任何运行理由),然后在 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);
  }
}

【讨论】:

  • @Minseo 没问题,我很高兴它为你整理好了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-11
  • 1970-01-01
  • 1970-01-01
  • 2013-10-20
  • 2011-02-18
  • 1970-01-01
  • 2014-12-01
相关资源
最近更新 更多