Помогите отредактировать код 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.

→ Ссылка