计算时间和距离差异的方法

时间:2017-10-01 18:52:27

标签: java

我正在制作一张公共交通卡。我希望您能帮助定义三种相关方法:

isCheckedIn(long time) 

返回是否在过去120分钟内成功签到,并且自上次成功检查后仍未检出。

checkIn(int x, int y, long time)  

哪些

  • x和y是参数,即当前位置
  • 如果在新行程中办理登机手续,请留言:"签入"。
  • 如果已经办理登机手续,请继续保持当前状态,并发送消息:"续行"。
  • 只要您至少每120分钟办理登机手续,就可以永远保持旅行。

checkOut(int x,int y,long time)

其中:

  • 结束当前行程并使用公式12 +(maxX - minX + maxY - minY)* 3从天平中扣除整个行程的价格,其中max和min取自checkIns的所有坐标和最后检查。

示例消息:

  • "退房了!价格是2美元,剩余余额是98美元"

  • "错误:无法退房;目前尚未签入"

到目前为止我做了什么:

import java.time.Instant;
import java.time.temporal.ChronoUnit;

public class TravelCard {

//Card balance
private int balance;

// isCheckedIn
private boolean isCheckedIn;
private Instant instant;

// distant x,y
private int x;
private int y;



public TravelCard()

{
    balance = 100;
    isCheckedIn = false;


}

public void depositMoney(int amount) {


    if (amount >= 0) {
        balance += amount;
        System.out.println(amount + " dollars deposited. New balance: " + balance + " dollars");
    } else {
        System.out.println("Error: Cannot deposit negative amount");
    }

}

public boolean isCheckedIn(long time) {

    Instant instant1 = Instant.now();
    time = ChronoUnit.MINUTES.between(instant, instant1);

    // time
    if (isCheckedIn && time <= 120) return true;
    else return false;

}

public void checkIn(int x, int y, long time) {

    this.x = x;
    this.y = y;

    if (time == 0) {
        System.out.println("Checked in");
    } else if (time <= 120) {
        System.out.println("Continued journey");
    }

}


public void checkOut(int x, int y, long time) {

}



public static void main(String[] args) {


     }

}

我在checkOut方法中完全迷失了,除了打印消息的方法。有谁可以帮我解决这个问题?提前谢谢了!

2 个答案:

答案 0 :(得分:1)

下面编写的代码只是为了向您展示如何存储x和y的最大值和最小值。其他方法是将所有x和y值存储在数组中。但是内存消耗会不必要地增加。

public TravelCard(){
    x_min = 9999999;
    y_min = 9999999;
    x_max = 0;
    y_max = 0;
    balance = 100;
    isCheckedIn = false;
}

public void checkIn(int x, int y, long time) {
    //we save the new x and y, only if they are larger than previous ones
    if (x >this.x_max){
        this.x_max = x;
    } else if(x < this.x_min){
        this.x_min = x;
    }
    if (y >this.y_max){
        this.y_max = y;
    } else (y<y_min){
        this.y_min = y;
    }


    if (ischeckedIn()) {
        System.out.println("Continued Journey");
    } else if {
        System.out.println("CheckingIn Now");
        this.instant = Instant.now()
        isCheckedIn = true;
    }

 }

public boolean isCheckedIn(l) {

    Instant instant1 = Instant.now();
    if(this.isCheckedIn){
        time = ChronoUnit.MINUTES.between(instant, instant1);
    } else {
         return false;
    }

    // time
    if (isCheckedIn && time <= 120) return true;
    else{
        System.out.println("Your time is out! i.e Auto Checkout")
        this.isCheckedIn = false;
        return false;
}
public void checkOut(int x,int y,long time){
    if(this.isCheckedIn){
        //updating x and y at checkout time
        if (x >this.x_max){
            this.x_max = x;
        } else if(x < this.x_min){
            this.x_min = x;
        }
        if (y >this.y_max){
            this.y_max = y;
        } else (y<y_min){
            this.y_min = y;
        }
        //Now we alredy have max and min for x and y
        int expense = 12 +((this.x_max - this.x_min)+(this.y_max - this.y_min))*3;
        this.balance = this.balance - expense;
        System.out.println("Expense for trip: "+expense+", Available Balance:" +this.balance);
    }else{
        System.out.println("Error: Cannot check out; Not currently checked in");
}

即使在编写此代码之后,仍然存在问题,如果人在120分钟后自动检出,您将如何在确切的第120分钟检索x和y值。在现实生活中,我们不断听取x和y值的变化,并不断更新。

答案 1 :(得分:1)

这听起来很像大学作业问题。我认为拥有问题的完整背景可能更有帮助,而不仅仅是你对它的解释。例如,为什么isCheckedIn()函数要求您传递一个时间值?这是一个要求还是只是你对答案应该如何解释。您实际上似乎并没有将变量用于任何计算,因此无论我将其设置为0还是1000,结果都不会改变。我还建议您在来到这里之前向TA /老师寻求帮助,因为它和#39;这样一个特定的问题,你可能会得到更多的直接帮助。

但是,试着回答一些问题。

ischeckedIn(lomg time)

我注意到的第一件事是你使用即时变量而没有在构造函数中初始化它。看起来这个变量在checkIn时间之前不应该有一个值,所以你应该对该逻辑进行空检查。第二件事是,既然您有一个值来查看以前是否已经签入过故障单,那么这应该是您迈出的第一步,这样您就不会重复工作了:

public boolean isCheckedIn() {
    if(!isCheckedIn) return false;
    ....
    //some logic
}

关于该函数的第二件事是,因为120是您的签入时间的常量,所以您应该将它移出函数并将其存储为类的静态final int。

我还建议如果你的isCheckedIn()方法将返回false,那么你应该将isCheckedIn值设置为false,直到它们再次检入为止。

checkIn(int x, int y, long time)

这里有很多要点。由于您需要跟踪x和y的最小值和最大值,因此您需要在某种数组中存储checkin坐标,或者需要为坐标设置3个变量。 minX,maxX,currentX和y相同。

在执行存储坐标的逻辑之后,您应该检查此人是否已经签入。

if(isCheckedIn(time)) {
    // your logic
}

如果时间> 120分钟,您当前的方法将失败。如果时间> 120,并且在再次签入之前必须支付余额的消息,那么在这里使用一些方法可能会更好。如果您已签入,则应使用您的时间值创建新的时刻以替换旧的时刻。我会考虑将返回值设为字符串,以便让方法的使用者决定如何处理结果。

checkOut(int x, int y, long time)

此方法应与checkIn方法非常相似。您的第一步应该是检查您是否确实已经登记。

if(!isCheckedIn(time)) {
    // return error message
}

如果您已签入,则执行与checkIn相同的逻辑以存储坐标。此时,您可以运行公式来计算成本,减少余额并返回信息。