>

반 친구와 함께 학교 과제를하고 있습니다. 우리는 당신이 택시를 시작하고 중지하고, 현재 가격을 요구하고 택시가 멈출 때 총 가격을 얻을 수있는 택시 응용 프로그램을 만들고 있습니다. 현재는 잘 작동합니다. 그러나 예를 들어 택시 1을 시작한 다음 택시 2를 시작하면 문제가 발생합니다. 택시 1의 시작 및 종료 시간은 새 객체 (택시 2) 시작 및 종료 시간으로 덮어 씁니다. 사용자가 시스템에 입력 한 번호에 따라 배열 목록을 표시합니다.

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

코드가 지저분해서 죄송합니다. 언어를 처음 접했습니다. 짧은 질문은 새 택시 인스턴스를 만들 때마다 프로그램이 덮어 쓰이지 않도록 다른 개체를 정의하는 방법입니다.

정말 감사합니다. / 닉

  • 답변 # 1

    택시 클래스에서 이러한 메소드를 정적으로 변경해야하는 가장 간단한 변경 사항은 다음과 같습니다.

    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;
    
    

    와이즈 비즈 와이즈 비즈  루프 바깥에 놓으면 매번 사용할 수 있습니다.

    yz

    Note: you do not need make 를 구성하는 속성 만 포함  수업 시간에 의견이 말했듯이, new Scanner(System.in) 가  당신의 Taxi 에서  수업은 좋은 생각이 아닙니다. 당신의 taxiList  클래스에는택시를 구성하는필수 속성만 있어야합니다. 더 나은 구조는 다음과 같습니다

    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옵션이 더 좋습니다.  수업. 이렇게 보일 수 있습니다

    Main
    
    

    List<Taxi> taxiList = new ArrayList<>() 에서 이것을 사용하는 방법  수업

    새로운 TaxiManager 만들기  선택한 논리 ( 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  이런 식으로 보일 것입니다

    switch case
    
    

    그리고 당신의 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 } } } 에서 그것을 호출  수업, 이것을 사용

    Ensure a class has only one instance, and provide a global point of access to it

    TaxiManager

  • 이전 macos mojave - 아카이버 (ar) 인터페이스를 확인할 때 /configure 스크립트가 실패 함
  • 다음 python - 명시 적으로 지정되지 않은 문자열을 두 줄 이상으로 나누는 방법은 무엇입니까?