Java - печать объектов ArrayList в определенном формате с помощью метода toString () - PullRequest
0 голосов
/ 11 декабря 2018

Я делаю модель солнечной системы, которая использует различные солнечные системы и наборы планет с помощью классов.Я решил использовать arraylist для хранения каждого объекта планеты в солнечной системе, хотя сейчас пытаюсь вывести данные в подходящем формате.

Формат, который я ищу в методе toString ()«Планета X имеет массу Земли A, является ли BAU ее звездой, и находится ли она на орбите в C лет: может быть пригодной для обитания?D '

Я пытался использовать циклы for для печати каждой планеты, но не верю, что это правильный путь, поскольку возврат приведет к остановке цикла.Большое спасибо

SolarSystem.java

import java.util.ArrayList;
public class SolarSystem {

    private String systemName;
    private double systemLuminosity;


    public SolarSystem(String name, double luminosity) {
        this.systemName = name;
        this.systemLuminosity = luminosity;
    }

    ArrayList<Planet> list = new ArrayList<>();

    public void addPlanet(String name, double mass, double distance) {

        list.add(new Planet(name, mass, distance, systemLuminosity));

    }

    public void planetProperties() {

    }

    public String toString() {
        System.out.println(list.size());
        String results = "+";
        for (Planet planet : list) {
            results += planet.getName(); //if you implement toString() for Dog then it will be added here
        }
        return results;
    }
}

Planet.java

    public class Planet {

        private String planetName;
        private double planetMass;
        private double distanceFromStar;
        private double orbitalPeriod;
        private String isHabitable;

        public Planet(String name, double mass, double distance, double systemLuminosity) {

            setName(name);
            setMass(mass);
            setDistanceFromSun(distance);
            setOrbitalPeriod(distance);
            setIsHabitable(mass, distance, systemLuminosity);


        }

        public void setName(String name) {
            planetName = name;
        }

        public  String getName() {
            return planetName;
        }

        public  void setMass(double mass) {
            planetMass = mass;
        }

        public double getMass() {
            return planetMass;
        }

        public void setDistanceFromSun(double distance) {
            distanceFromStar = distance;
        }

        public double getDistanceFromStar() {
            return distanceFromStar;
        }

        public void setOrbitalPeriod(double distance) {
            orbitalPeriod = Math.sqrt(distance*distance*distance);
        }

        public double getOrbitalPeriod() {
            return orbitalPeriod;
        }

        public void setIsHabitable(double mass, double distance, double luminosity) {
            if (mass >= 0.6 && mass <= 7.0) {
                if ((distance >= 0.75 * Math.sqrt(luminosity)) && (distance <= 2.0 * Math.sqrt(luminosity))) {
                    isHabitable = "yes";
                } else {
                    isHabitable = "no";
                }
            } else {
                isHabitable = "no";
            }

        }

        public String getIsHabitable() {
            return isHabitable;
        }
    }

Main.java

public class Main {

    public static void main(String[] args) {

        //Create our solar system
        SolarSystem ourSystem = new SolarSystem("Our System",1.0);

        //Add planets in our solar system
        ourSystem.addPlanet("Mercury", 0.055, 0.387);
        ourSystem.addPlanet("Venus", 0.815, 0.723);
        ourSystem.addPlanet("Earth", 1.0, 1.0);
        ourSystem.addPlanet("Mars", 0.107, 1.52);
        ourSystem.addPlanet("Jupiter", 317.8, 5.20);
        ourSystem.addPlanet("Saturn", 95.2, 9.58);
        ourSystem.addPlanet("Uranus", 14.5, 19.20);
        ourSystem.addPlanet("Neptune", 17.1, 30.05);

        System.out.println(ourSystem.toString());



    }
}

Ответы [ 4 ]

0 голосов
/ 11 декабря 2018

Чтобы повторить другие постеры, вам нужно сначала определить собственный метод toString () в классе планеты.Пожалуйста, смотрите мои предложения ниже.Они представлены как псевдокод, набранный на лету, а не как реальный код (поскольку может быть несколько вещей, которые могут не скомпилироваться.)

Но псевдокод должен дать представление о возможномрешение.Напишите мне, если у вас все еще есть вопросы.

Исходя из ваших требований:

Формат, который я ищу в методе toString (): «Планета X имеет массу AЗемли, BAU от ее звезды, и орбиты в C лет: могли бы быть обитаемыми?D '

Ваш метод Planet.toString может выглядеть следующим образом (это псевдокод, который не обязательно должен быть компилируемым, но вы понимаете его суть.)

public class Planet {

    /* your class as it is, with the 
     * addition of a possible toString 
     * implementation */

        public String toString(){
                return String.format(
                    "Planet: %s, " + 
                    "mass: %f, " + 
                    "distance: %f, " + 
                    "orbital period: %f, " + 
                    "habitable: %b" 
                    this.getName(), 
                    this.getMass(), 
                    this.getDistanceFromStar(), 
                    this.getOrbitalPeriod(),
                    this.getIsHabitable());
        }
}

Тогда ваш класс SolarSystem должен иметь соответствующий метод toString, который зацикливается на коллекции планет.Ваш оригинальный метод toString имел правильную идею, я просто расширяю понятие.

public class SolarSystem {

    /* 
    Your solar system class plus some changes 

    ... 
    */

    public String getName(){
        return this.systemName;
    }

    public String getLuminosity(){
        return this.systemLuminosity;
    }

    public int getPlanetCount(){
        return this.list.size();
    }

    public String toString() {
        final StringBuffer buffer = new StringBuffer();
        buffer.append(
            String.format("System: %s\nLuminosity: %f\nPlanet Count:%d\n",
                this.getName(),
                this.getLuminosity(),
                this.getPlanetCount()
            )
        );
        for (final Planet planet : list) {
            buffer.append('\t')
                .append(planet.getString())
                .append('\n');
        }
        return buffer.toString();
    }

}

Теперь, я немного запутался с этим:

Я пытался использоватьоднако циклы для печати каждой планеты не верят, что это правильный путь, поскольку возврат приведет к остановке цикла.Большое спасибо

Оператор возврата остановит цикл, если возврат будет выполнен внутри цикла.

Оператор возврата будет выполнен в функции, вызываемой внутри цикла , не будет завершение цикла.

То есть возврат завершает только функцию, которая выполняет обратный вызов, а не функции в цепочке вызовов.

Сравните это

for(Foo f : fooList){
  if(something){ 
    return; // this will stop the loop
  }
}

С этим

for(Foo f : fooList){
   if(something){
      callThisFu(); // the return within callThisFu *will not* exit the loop
   }
}

Надеюсь, это все прояснит.

0 голосов
/ 11 декабря 2018

Вам необходимо реализовать метод toString() внутри вашего Planet класса, например:

class Planet {
    private String planetName;
    private double planetMass;
    private double distanceFromStar;
    private double orbitalPeriod;
    private String isHabitable;

    @Override
    public String toString() {
        return String.format(
                "Planet %s has a mass of %f Earths, is %f from its star, and orbits in %f years: could be habitable? %s%n",
                this.planetName, this.planetMass, this.distanceFromStar, this.orbitalPeriod, this.isHabitable);
    }

}

Затем внутри вашего SolarSystem класса вы можете создать список с чем-то вроде этого, вы ужеэта часть почти правильная, но я изменил getName на toString:

@Override
public String toString() {
    StringBuilder buf = new StringBuilder();

    for (Planet planet : list) {
        buf.append(planet);
    }

    return buf.toString();
}
0 голосов
/ 11 декабря 2018

Вы должны переопределить toString в классе Planet и заменить toString из SolarSystem, чтобы использовать его.

public class Planet {
  ...
  public String toString() {
     return "Planet " + planetName + " has a mass of " + planetMass + 
            " Earths, is BAU from its star, and orbits in " + orbitalPeriod + 
            " years: could be habitable? " + isHabitable;
  }
}

public class SolarSystem {
  ...

  public String toString() {
    String results = "";
     for (Planet planet : list) {
        results += planet.toString() + "\n"; // Use the toString of planet and add a new line 
     }
     return results;
  }
}

Примечание: по соображениям производительности, как прокомментировал oleg, этопредпочтительнее использовать StringBuilder для объединения строк.В этой ситуации, когда у вас мало предметов и проблема не связана с выступлениями, вы можете оставить оператор +.


Расширяя свои знания Java, вы найдете полезные функции, такие как String.join :

Возвращает новую строку, состоящую из копий элементов CharSequence, объединенных вместе с копией указанного разделителя.

Это поможет вам упростить управление вашим кодоми очиститель заменив это:

public String toString() {
    String results = "";
     for (Planet planet : list) {
        results += planet.toString() + "\n"; // Use the toString of planet and add a new line 
     }
     return results;
  }

на

public String toString() {
  return String.join("\n", list);
}

, но мой совет должен начать с основы Java, прежде чем пытаться использовать более продвинутые функции.В противном случае вы будете использовать их, не зная, что происходит за кулисами

0 голосов
/ 11 декабря 2018

Если вы хотите распечатать описание для всей солнечной системы (весь список массивов планет), я бы предложил реализовать метод toString () внутри класса Planet.Это позволит вам просто перебрать список массивов Planets и просто вызвать planet.toString ().Инкапсуляция логики для единственной планеты внутри класса Планета - путь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...