Список «уникальных» объектов в Java - PullRequest
0 голосов
/ 09 февраля 2019

Я делаю школьное задание со своим одноклассником.Мы создаем приложение для такси, где вы можете запускать и останавливать такси, запрашивать текущую цену и получать полную стоимость, когда такси остановлено.На данный момент все работает отлично.Но проблема возникает, если мы запустим Такси 1, например, а затем запустим Такси 2. Время начала и окончания Такси 1 перезаписывается временем начала и окончания новых объектов (Такси 2), даже если мы получаем уникальный объект изи arraylist на основе номера, который пользователь вводит в систему.

Код в Main.java:

import java.text.DecimalFormat;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Taxi taxi = new Taxi();
        System.out.println("Hej og velkommen til Damn Fast Taxis.");
        boolean isEnd = false;
        DecimalFormat decimalFormat = new DecimalFormat("#.0");
        while(!isEnd) {

            Taxi chosenTaxi;

            System.out.println("1. Start en taxi.");
            System.out.println("2. Stop en taxi.");
            System.out.println("3. Pause en taxi.");
            System.out.println("4. Spørg efter pris.");
            System.out.println("5. Gratis tur.");
            System.out.println("6. Tilføj antal taxier.");

            Scanner sc = new Scanner(System.in);
            String choice = sc.nextLine();

            switch (choice) {
                case "1":
                    if (taxi.getTaxiListPrint().size()>=1) {

                        Scanner startTaxiNumber = new Scanner(System.in);
                        int numberChoice = startTaxiNumber.nextInt();
                        chosenTaxi = taxi.chooseTaxi(numberChoice);

                        chosenTaxi.setStartTime();
                        break;
                    } else {
                        System.out.println("Ingen taxier er oprettet i systemet.");
                        break;
                    }

                case "2":

                    if (taxi.getTaxiListPrint().size()>=1) {
                        Scanner endTaxiNumber = new Scanner(System.in);
                        int numberChoice = endTaxiNumber.nextInt();
                        chosenTaxi = taxi.chooseTaxi(numberChoice);

                        chosenTaxi.setEndTime();

                        if (!chosenTaxi.isStopped()) {
                            System.out.println("Turen varede " + decimalFormat.format(((chosenTaxi.getEndTime() - chosenTaxi.getStartTime()) / 100)*0.1) + " sekunder.");
                            Price price = new Price();
                            String finalPrice = price.calculatePrice(chosenTaxi.getStartTime(), chosenTaxi.getEndTime(), decimalFormat);
                            System.out.println("Pris: " + finalPrice + " dollars.");
                            chosenTaxi.setStopped(true);
                        } else {
                            System.out.println("Denne taxi er allerede blevet stoppet.");
                        }
                        break;
                    } else {
                        System.out.println("Ingen taxier er oprettet i systemet.");
                    }
                case "3":
                    break;
                case "4":

                    if (taxi.getTaxiList().size()>=1) {
                        Scanner currentPriceTaxiNumber = new Scanner(System.in);
                        int numberChoice = currentPriceTaxiNumber.nextInt();
                        Taxi currentChosenTaxi = taxi.chooseTaxi(numberChoice);

                        currentChosenTaxi.setEndTime();
                        if (!currentChosenTaxi.isStopped()) {
                            Price priceNow = new Price();
                            String currentPrice = priceNow.calculatePrice(currentChosenTaxi.getStartTime(), currentChosenTaxi.getEndTime(), decimalFormat);
                            System.out.println("Pris: " + currentPrice + " dollars.");
                        } else {
                            System.out.println("Denne taxi er allerede blevet stoppet.");
                        }
                        break;
                    } else {
                        System.out.println("Ingen taxier er oprettet i systemet.");
                        break;
                    }

                case "5":

                    break;
                case "6":
                    System.out.println("Hvor mange taxier vil du tilføje?");
                    Scanner taxaNumber = new Scanner(System.in);
                    int number = taxaNumber.nextInt();
                    for (int i = 0; i<number;i++) {
                        taxi.addTaxi(taxi);
                    }
                    System.out.println(number + " " + "Taxa'er tilføjet!");
                    break;
                default:
                    isEnd = true;

     break;

Класс такси:

import java.util.ArrayList;
import java.util.List;

public class Taxi {

    private long startTime;
    private long endTime;
    private boolean isStopped = false;
    private List<Taxi> taxiList = new ArrayList<>();

    public void addTaxi(Taxi taxi) {
        taxiList.add(taxi);
    }

    public Taxi chooseTaxi(int choice) {
        return taxiList.get(choice - 1);
    }

    public List<Taxi> getTaxiListPrint() {

        for(int i = 1; i<taxiList.size() + 1;i++) {
            System.out.println("Taxi: " + i);
        }
        return taxiList;
    }

    public List<Taxi> getTaxiList() {
        return taxiList;
    }

    public long getStartTime() {
        return startTime;
    }

    public long getEndTime() {
        return endTime;
    }

    public boolean isStopped() {
        return isStopped;
    }

    public void setStartTime() {
        this.startTime = System.currentTimeMillis();
    }

    public void setEndTime() {
        this.endTime = System.currentTimeMillis();
    }

    public void setStopped(boolean stopped) {
        isStopped = stopped;
    }
}

I 'Извините, если мой код не совсем понятен, я очень плохо знаком с языком.Короткий вопрос: как определить различные объекты, чтобы программа не перезаписывала каждый раз, когда я делаю новый экземпляр такси?

Большое спасибо./ Ник

Ответы [ 2 ]

0 голосов
/ 09 февраля 2019

Включайте только атрибуты, которые составляют Taxi в вашем классе

Как отмечалось в комментариях, наличие taxiList в вашем Taxi классе не является хорошей идеей.Ваш Taxi класс должен иметь только необходимые атрибуты , которые составляют Taxi .Лучшая структура будет выглядеть следующим образом:

public class Taxi {
    private long startTime;
    private long endTime;
    private boolean isStopped = false;

    // Add the necessary getters & setters for the above attributes here
}

Управляйте своими такси через List или TaxiManager класс

Для удержания taxiList у вас есть 2 варианта

  1. В вашем Main классе определите List<Taxi> taxiList = new ArrayList<>()
  2. Создайте отдельный класс для хранения списка и логики для управления его элементами.Например, TaxiManager

Опция 1-й - хороший способ, если у вас есть небольшое количество возможных операций на Такси .Опция 2nd лучше, если вы хотите абстрагировать логику управления такси от класса Main.Это может выглядеть так

public class TaxiManager {
    private List<Taxi> taxiList;
    public class TaxiManager() { taxiList = new ArrayList<>(); }

    // Here are some "management" methods you can use
    // DON'T FORGET TO HANDLE EXCEPTIONS (for example ArrayOutOfBounds, ...)

    public void addTaxi(Taxi newTaxi) { taxiList.add(newTaxi); }
    public Taxi getTaxiAtIndex(int index) { return taxiList.get(index); }
    public void stopTaxiAtIndex(int index) { taxiList.get(index).stop(); }

    // Add the necessary operations here
}

Как использовать это в вашем Main классе

Создать новый TaxiManager и вызывать ваши методы в соответствии с выбранной логикой (* 1046)*)

public class Main {
    public static void main(String[] args) {
        TaxiManager taxiManager = new TaxiManager();

        Scanner sc = new Scanner(System.in);
        String choice = sc.nextLine();

        switch (choice) {
            case "add": {
                taxiManager.addTaxi(new Taxi());
                break;
            }
            // Include other options
        }
    }
}

Ответ на вопрос «уникальных объектов» => Использовать Singleton

Убедитесь, что у класса есть только один экземпляр, и предоставьтеглобальная точка доступа к ней

Это может быть хорошим выбором для вашего TaxiManager, если вы хотите вызывать его из разных «классов» и при этом сохранить уникальность тот менеджер .Затем вы можете быть уверены, что ваши такси не дублируются.Если вы хотите пойти по этому пути, ваш TaxiManager будет выглядеть примерно так

public class TaxiManager {
    private List<Taxi> taxiList;
    private TaxiManager() {}

    private static class SingletonHolder {
        private static final TaxiManager INSTANCE = new TaxiManager();
    }

    public static TaxiManager getInstance() {
        return SingletonHolder.INSTANCE;
    }

    // Add other methods here
}

И чтобы вызвать его из вашего Main класса, используйте этот

TaxiManager taxiManager = TaxiManager.getInstance();
0 голосов
/ 09 февраля 2019

Я думаю, что самое простое изменение - изменить эти методы в классе Такси на статические:

private static List<Taxi> taxiList = new ArrayList<>();

public static void addTaxi(Taxi taxi) {
    taxiList.add(taxi);
}

public static Taxi chooseTaxi(int choice) {
    return taxiList.get(choice - 1);
}

public static List<Taxi> getTaxiListPrint() {

    for (int i = 1; i < taxiList.size() + 1; i++) {
        System.out.println("Taxi: " + i);
    }
    return taxiList;
}

public static List<Taxi> getTaxiList() {
    return taxiList;
}

Изменить эти методы на статические, например:

Taxi currentChosenTaxi = taxi.chooseTaxi(numberChoice);

изменить на

Taxi currentChosenTaxi = Taxi.chooseTaxi(numberChoice);

Затем добавьте к менеджеру разные такси:

            case "6":
                System.out.println("Hvor mange taxier vil du tilføje?");
                Scanner taxaNumber = new Scanner(System.in);
                int number = taxaNumber.nextInt();
                for (int i = 0; i < number; i++) {
                    Taxi.addTaxi(new Taxi());
                }
                System.out.println(number + " " + "Taxa'er tilføjet!");
                break;

Примечание: вам не нужно каждый раз делать new Scanner(System.in), вы можете использовать его, если вы выводите на улицупетли.

...