1

我们被要求为 Stopwatch 构建一个构造函数,该构造函数接受格式为“##:##:###”的字符串并相应地更新分钟、秒和毫秒(私有实例变量)。例如,"1:21:300"表示 1 分 21 秒 300 毫秒。

所以我尝试使用string.split()配对parseInt来更新值。但是,该程序不会编译。根据 eclipse,我的构造函数具有正确的语法,但是我正在做的事情有问题。我从来没有真正使用过splitnor parseInt,所以我可能会 100% 错误地使用这些。谢谢你。

    public StopWatch(String startTime){
    String [] timeArray = startTime.split(":");

    if(timeArray.length == 2){
        this.minutes = Integer.parseInt(timeArray[0]);
        this.seconds = Integer.parseInt(timeArray[1]);
        this.milliseconds = Integer.parseInt(timeArray[2]);
    }
    else if(timeArray.length == 1){
        this.minutes =  0;
        this.seconds = Integer.parseInt(timeArray[1]);
        this.milliseconds =    Integer.parseInt(timeArray[2]);              
    }
    else if(timeArray.length == 0){
        this.minutes = 0;
        this.seconds = 0;
        this.milliseconds = Integer.parseInt(timeArray[2]);             
    }
    else{
        this.minutes = 0;
        this.seconds = 0;
        this.milliseconds = 0;
    }
}

PS Junit 测试在尝试执行以下操作时显示“ComparisonFailue:预期 0:00:000 但为 20:10:008”:

s = new StopWatch("20:10:8");
assertEquals(s.toString(),"20:10:008");
4

4 回答 4

2

将您的 toString() 方法替换为:

public String toString() {
    String paddedMinutes = String.format("%02d", this.minutes);
    String paddedSeconds = String.format("%02d", this.seconds);
    String paddedMilliseconds = String.format("%03d", this.milliseconds);
    return paddedMinutes + ":" + paddedSeconds + ":" + paddedMilliseconds;
}
于 2013-05-22T01:01:18.393 回答
2

正如其他答案中提到的,每个长度都减少了 1,但是您在 if 块中使用的索引也关闭了;例如。如果长度为 1,则唯一可用的索引为 0,如果长度为 2,则可用的索引为 0 和 1。

因此,您会得到一个如下所示的构造函数:

class StopWatch {
    int minutes;
    int seconds;
    int milliseconds;

    public StopWatch(String startTime) {
        String[] timeArray = startTime.split(":");

        if (timeArray.length == 3) {
            this.minutes = Integer.parseInt(timeArray[0]);
            this.seconds = Integer.parseInt(timeArray[1]);
            this.milliseconds = Integer.parseInt(timeArray[2]);
        } else if (timeArray.length == 2) {
            this.minutes = 0;
            this.seconds = Integer.parseInt(timeArray[0]);
            this.milliseconds = Integer.parseInt(timeArray[1]);
        } else if (timeArray.length == 1) {
            this.minutes = 0;
            this.seconds = 0;
            this.milliseconds = Integer.parseInt(timeArray[0]);
        } else {
            this.minutes = 0;
            this.seconds = 0;
            this.milliseconds = 0;
        }
    }
}
于 2013-05-22T01:01:49.573 回答
1

尽管 Java 数组是从零开始的,但它们的长度只是计算元素的数量。

所以,{1,2,3}.length会回来3

由于您的代码现在编写,您将ArrayOutOfBounds左右得到异常。

于 2013-05-22T00:56:46.733 回答
0
if(timeArray.length == 2){

应该:

if(timeArray.length == 3){

等等。

20:10:8 拆分为 : 将为您提供 3 的长度;)

于 2013-05-22T00:56:19.193 回答