2013-05-22 20 views
1

我们被要求为秒表构建一个秒表,其格式为“##:##:###”并更新分钟,秒和毫秒(私有实例变量)因此。例如,"1:21:300"表示1分21秒300毫秒。在Java中使用parseInt分割字符串

所以我想用string.split()配对parseInt更新值。但是,该程序不会编译。我的构造函数根据eclipse具有正确的语法,但是我正在做的事情有问题。我从来没有使用splitparseInt,所以我可能会使用这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; 
    } 
} 

P.S. JUnit测试说 “ComparisonFailue:预计0:00:000,但被20:10:008” 试图做的时候:

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

什么是你的秒表的ToString()?如果你没有定义一个,你就继承了Object中的一个,它不会做你想做的事。 –

+0

或者如果你有一个我认为你可能有领先0的问题 – cerkiewny

回答

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

非常感谢!快速和有益的答案。 – Enormosaurus

+0

@ user2407581 - 我们希望提供足够的提示足以让您走上正轨。 –

0
if(timeArray.length == 2){ 

应该是:

if(timeArray.length == 3){ 

等。

20:10:8分割的条件:给你的3的长度;)

1

虽然Java数组是基于零的,它们的长度简单地计算元件的数量。因此,{1,2,3}.length将返回3

由于您的代码现在写入,您将会在左右出现ArrayOutOfBounds例外情况。

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

我不知道%02d是什么。这只是我第二个学期的程序设计(并且我在两个学期之间转到了另一所大学,这是一个很大的错误)。尽管如此,我会进一步研究,谢谢你的回应。 – Enormosaurus

+0

这是一个很好的建议,但问题在给定的代码中已经很明显。 –

+0

@ user2407581'%.. d'将被给定数字(d)值的字符串表示替换。 2表示最多两位数字,0表示处理器应将值填充为零,直到达到最大大小(因此总是得到两位数字)。 –