Помогите отредактировать код Java
есть задание "Sozdat' aviakompaniyu(сделано). Посчитать общую вместимость и грузоподъемность(Gruzopodyemnost' samoleta и Obshchaya vmestimost). Провести сортировку самолетов компании по дальности полета(Spisok samoletov). "Нужна помощь в редактировании кода... хочу сделать, чтобы в метод System.out.println("----- Obshchaya vmestimost' i gruzopodyemnost' -----"); выводилась сумма значений Gruzopodyemnost' samoleta и Obshchaya vmestimost,грузоподъемность чтобы началась не с 0 а с единицы; И нужно в массив добавить значение максимальной дальности (maxDistance) в диапазоне от 700 до 800 с шагом в 20, так что бы Spisok samoletov значение дальности полета выводилось, а в Gruzopodyemnost' samoleta и Obshchaya vmestimost не выводилось значение дальности полета. И нужно провести сортировку самолетов Spisok samoletov po dal'nosti poleta только по дальности полета. Подскажите, плиз как это реализовать)
package AirCompany;
import java.util.Random;
public class AirCompany {
private Plane[] plane;
public AirCompany() {
plane = new Plane[5];
}
public void sortPlane() {
Plane temp = new Plane(0);
for (int i = 0; i < plane.length - 1; i++) {
for (int j = 0; j < plane.length - 1; j++) {
if (plane[j].getFuelRate() > plane[j + 1].getFuelRate()) {
temp = plane[j + 1];
plane[j + 1] = plane[j];
plane[j] = temp;
}
}
}
}
public void printPlane(Plane[] taxi) {
for (Plane i : plane) {
System.out.println("Gruzopodyemnost' samoleta " + i.getCarrying()
+ " Obshchaya vmestimost' " + i.getFuelRate());
}
}
public void setPlane() {
Random rand = new Random();
for (int i = 0; i < plane.length; i++) {
plane[i] = new Plane(rand.nextInt(5) + 7, 20 * (i + 1), i);
}
}
public Plane[] getPlane() {
return (Plane[]) plane;
}
public void findByCarrying(int first, int end) {
int count = 0;
for (Plane i : plane) {
if (i.getCarrying() > first && i.getCarrying() < end) {
count++;
System.out.println("Gruzopodyemnost' samoleta " + i.getCarrying()
+ " Obshchaya vmestimost' " + i.getFuelRate());
}
}
if (count == 0)
System.out
.println(" V nashey aviokompanii net podkhodyashchikh samoletov.");
}
public static void sortCompany() {
}
public static void printCompany(Plane[] plane2) {
}
}
package AirCompany;
public class ConsoleApp {
public static void main(String[] args) {
AirCompany companyList = new AirCompany();
companyList.setPlane();
System.out.println("----- Spisok samoletov -----");
companyList.printPlane(companyList.getPlane());
companyList.sortPlane();
System.out.println("----- Obshchaya vmestimost' i gruzopodyemnost' -----");
companyList.printPlane(companyList.getPlane());
System.out.println("----- Spisok samoletov po dal'nosti poleta -----");
companyList.findByCarrying(700, 800);
}
}
package AirCompany;
public class Plane {
private int fuelRate;
private int maxDistance;
private float carrying;
public Plane(int i) {
}
public Plane(int placeCount, int distance, float carrying) {
this.fuelRate = placeCount;
this.maxDistance = distance;
this.carrying = carrying;
}
public float getCarrying() {
return carrying;
}
public void setCarrying(float carrying) {
this.carrying = carrying;
}
public int getFuelRate() {
return fuelRate;
}
public void setFuelRate(int fuelRate) {
this.fuelRate = fuelRate;
}
public int getMaxDistance() {
return maxDistance;
}
public void setMaxDistance(int maxDistance) {
this.maxDistance = maxDistance;
}
}
Ответы (1 шт):
Ваше решение не соответствует тому, что вы написали в условии. В условии нет ничего про от диапазоны с 700 до 800 с шагом 20, нет информации о том, какие заголовки должны быть при выводе и о том, что объект Plane должен выводиться в консоль по разному и т.д. Очень много противоречий между общим заданием и тем, что дописываете вы. Тогда пробуем реализовать это максимально гибко. Я классически использую ломбок, но если вам больше нравиться писать геттеры/сеттеры и т.д. руками, то можете и так.
Наша модель выглядит так:
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;
public class Plane implements Comparable<Plane>{
private final Integer fuelRate;
private final Integer maxDistance;
private final Integer carrying;
public static List<Plane> of(int numb) {
final List<Plane> planes = new ArrayList<>(numb);
for (int i = 0; i < numb; i++)
planes.add(new Plane(random(1,10), random(700,800), random(1,10)));
return planes;
}
public Plane(Integer fuelRate, Integer maxDistance, Integer carrying) {
this.fuelRate = fuelRate;
this.maxDistance = maxDistance;
this.carrying = carrying;
}
public Integer getFuelRate() {
return fuelRate;
}
public Integer getMaxDistance() {
return maxDistance;
}
public Integer getCarrying() {
return carrying;
}
private static int random(int min, int max) {
return ThreadLocalRandom.current().nextInt(min, max + 1);
}
@Override
public int compareTo(Plane o) {
return this.maxDistance.compareTo(o.getMaxDistance());
}
@Override
public String toString() {
return "Fuel rate : " + fuelRate + ", carrying : " + carrying + ", distance : " + maxDistance;
}
}
Возлагаем на модель генерацию своих же объектов (что-то сродни фабричного метода, хотя без интерфейсов в этом особого смысла нет, просто так логичнее). Метод рандома вынесен отдельно, поэтому вы можете регулировать значения рандома, изменяя аргументы метода при вызове new Plane(random(1,10), random(700,800), random(1,10)). Я не знаю,должен ли ваш код реализовывать сортировку по разным критериям. Судя по тому, что вы дописали нет. Только по дистанции. В этом случае сойдет Comparable, который мы имплементируем в модели. Если нужна сортировка по разным критериям, убирайте его и пишите компараторы. И , разумеется, toString(). Пусть объект сам определяет, как будет выглядеть в консоли.
Теперь класс AirCompany , который стал максимально простым:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.ToIntFunction;
public class AirCompany {
private final List<Plane> planes;
public AirCompany() {
planes = new ArrayList<>();
}
public void addPlanes(List<Plane> planes) {
this.planes.addAll(planes);
}
public void sortPlane() {
Collections.sort(planes);
}
public long totalCarrying() {
return total(Plane::getCarrying);
}
public long totalFuelRate() {
return total(Plane::getFuelRate);
}
private long total(final ToIntFunction<Plane> function) {
return planes.stream().mapToInt(function).sum();
}
public void printPlanes() {
printPlanes(null, Plane::toString);
}
public void printPlanes(Predicate <Plane> predicate, Function<Plane,String> planeFunction) {
planes.stream()
.filter(plane->predicate==null || predicate.test(plane))
.forEachOrdered(plane -> System.out.println(planeFunction.apply(plane)));
}
}
И , собственно, вызов:
public class ConsoleApp {
public static void main(String[] args) {
AirCompany airCompany = new AirCompany();
airCompany.addPlanes(Plane.of(5));
System.out.println("----- Список самолетов -----");
airCompany.printPlanes();
System.out.println("Общая вместимость : " + airCompany.totalFuelRate());
System.out.println("Общая грузоподъемность : " + airCompany.totalCarrying());
airCompany.sortPlane();
System.out.println("----- Список самолетов по дальности полета -----");
airCompany.printPlanes(plane -> plane.getMaxDistance() >= 700 && plane.getMaxDistance() <= 800, Plane::toString);
}
}
Поскольку я так и не понял, какие фильтры должны быть (вроде как только по дистанции, но не факт), а также почему вы решили, что вывод в консоль для объекта Plane должен быть разный, хотя в условии я этого не нашел, пишем таким образом, чтобы этим можно было легко управлять. Посему метод printPlanes() в классе AirCompany перегружен. Если мы его вызываем без аргументов, то получаем в консоль список всех самолетов, при этом поля, которые будут отображены в консоли, управляются методом toString() класса Plane. В данном случае видно, что метод printPlanes() делегирует выполнение методу printPlanes(Predicate predicate, Function<Plane,String> planeFunction) , при этом первый аргумент null (в этом случае фильтрации не будет и в консоль выведется весь список самолетов), а второй - вызов метода toString() класса Plane.
В дальнейшем из класа ConsoleApp будет вызван метод airCompany.printPlanes(plane -> plane.getMaxDistance() >= 750 && plane.getMaxDistance() <= 800, Plane::toString); Здесь мы передаем первым парметром предикат для фильтрации (расстояние в пределах от 750 до 800), а также Plane::toString. Второй аргумент нужен именно в том случае, если вы захотите изменит вид вывода в консоль. Тогда реализуйте в модели метод, аналогичный toString (разумеется, с другим именем), где опишите желаемый вид вывода в консоль, именно этот метод передавайте вторым аргументом и ваш вывод изменится так, как вам нужно.
Посему в данном случае вы можете выполнять любую фильтрацию по любым условиям и полностью управлять видом вывода в консоль объектов Plane.