[Java] Я создал класс добавления, и он компилируется, но ничего не добавляется в список массивов - PullRequest
0 голосов
/ 23 января 2020

Я создал несколько классов, и часть того, что я хочу сделать, - это создать солнечную систему и позволить пользователям вводить информацию о планетах и ​​непрерывно добавлять их в список массивов, а когда они завершат добавление планет, отобразит сводку их Солнечная система. Я хотел показать, какой pl anet, в зависимости от введенного ими орбитального радиуса, ближе всего к Солнцу. Поэтому, чтобы сделать это проще, я решил создать метод addPl anet (), который будет сканировать список массивов и добавлять новый pl anet в правильном порядке в зависимости от радиуса орбиты.

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!"); 
      }         
 }

Как Могу ли я исправить свой код так, чтобы, когда пользователь вводит pl anet, он фактически добавлялся в мой список планет в массиве?

РЕШЕНИЕ: Я забыл добавить

solarSystem.addPlanet(a);

после создания нового pl anet.

1 Ответ

2 голосов
/ 23 января 2020

глядя на логи c в добавлении pl anet

Первое, что было упомянуто ранее, это ваш для l oop склонен к IndexOutOfBoundsException, поэтому сначала измените От <= до <, как показано ниже, причина этого, size () возвращает количество объектов в массиве, но индекс начинается с 0, поэтому для массива из 3 объектов максимальный индекс будет только 2. </p>

когда вы добавляете новый pl anet, ваш оператор if ограничивает дополнительные планеты, добавляя только pl anet, если он имеет меньшую орбиту, если он имеет большую орбиту, чем все другие планеты, он будет Никогда не добавляйся, я понимаю, почему ты сделал это таким образом, и это добавляет pl anet в массив, чтобы держать их в порядке размеров, но тебе нужно учитывать добавление, если оно тоже больше.

Для этого я бы предложил следующее, удалите разрыв из if и замените его возвратом (если он добавляет pl anet, метод больше не имеет причин для запуска), и после для l oop, вставьте вызов addPl anet, который добавит в конце, если метод все еще работает. См. Модифицированный код ниже, я надеюсь, что это поможет.

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);
  }
}
...