【发布时间】:2019-02-09 16:24:22
【问题描述】:
我正在和我的同学一起做学校作业。我们正在制作一个出租车应用程序,您可以在其中启动和停止出租车,询问当前价格并在出租车停止时获得总价格。目前它工作正常。但是如果我们启动出租车 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;
}
}
如果我的代码很乱,我很抱歉,我对这门语言很陌生。简短的问题是:如何定义不同的对象,以便程序不会在每次创建新的出租车实例时都覆盖?
非常感谢。 /尼克
【问题讨论】:
-
请注意,我们通常会要求您尝试构建产生问题的尽可能短的代码,从而消除与展示问题无关的所有功能。请参阅帮助中心中的minimal reproducible example 定义,以及sscce.org 上的“修剪技巧”部分
-
也就是说——一般来说,让你的
TaxiList成为你的class Taxi的一部分是个坏主意。每个Taxi实例应该只代表一辆出租车。 -
每辆出租车都有自己的出租车列表。这是为什么呢?
-
另外,您的
for (int i = 0; i<number;i++) { taxi.addTaxi(taxi); }循环一遍又一遍地添加 same 出租车,因此您的列表中只有一堆对完全相同的出租车的引用,所以不管用户输入的号码是同一辆出租车。如果您希望它们成为不同的出租车,则需要类似于for (int i = 0; i<number;i++) { taxiList.addTaxi(new Taxi()); }(假设您构建了taxiList)。