2014-11-04 30 views
1

我有一個方法將字符串轉換爲MeterNumber。代碼如下。有人可以幫我修復這個toString方法請

public static MeterNumber fromString(String number) { 
     MeterNumber mn = new MeterNumber(false); 
     int i = 0, // position in number 
      n = 0, // number of digits 
      len = number.length(); 
     boolean valid = true; 
     while (valid && i < len) { 
     char c = number.charAt(i); 
     i = i + 1; 
     if (n < 9 && Character.isDigit(c)) { 
      mn.digits[n] = c - '0'; 
      n = n + 1; 
     } else if (Character.isWhitespace(c)) { 
      // skip spaces 
     } else { 
      valid = false; 
     } 
     } 
     int cs = mn.checksum(); 
     if (valid && i == len && n == 9 && 
      cs/10 == mn.digits[7] && cs % 10 == mn.digits[8]) { 
     return mn; 
     } else { 
     return null; 
     } 
    } 

它想讀這樣的輸入:

531 481 889 O 788.5 
652 364 795 P 2442.7 

它會正常工作,如果我只是提供:

531 481 889 
652 364 795 

但是它返回null如果我輸入的是這種格式:

531 481 889 O 788.5 
652 364 795 P 2442.7 

你可以請他我看到了這個問題。爲什麼Char和Double在行結尾干擾?

這是調用該方法的代碼。

private MeterNumber meterNumber; 


public static Meter load(Scanner sc) { 
     MeterNumber meterNumber = MeterNumber.fromString(sc.nextLine()); 
     int n = 1; 
     sc.nextLine(); 
     Tariff[] tariffs = new Tariff[n]; 
     for (int i = 0; i < n; i++) { 
     String kind = sc.next(); 
     sc.nextLine(); 
     if (kind.equals("P")) { 
      tariffs[i] = PeakTariff.PEAK_TARIFF; 
     } else if (kind.equals("O")) { 
      tariffs[i] = OffPeakTariff.OFF_PEAK_TARIFF; 
     } 
     } 
     return new Meter(meterNumber, tariffs); 
    } 

public MeterNumber getMeterNumber() { 
     return meterNumber; 
    } 

} 

這是代碼從我的主要方法調用:

Scanner sc2 = new Scanner(new java.io.File("Readings.txt")); 
     Meter meter = Meter.load(sc2); 

     System.out.println(meter.getMeterNumber()); 

在此先感謝。

+0

什麼是「MeterNumber」? – 2014-11-04 05:10:59

+0

這是一個九位數字 – lolian 2014-11-04 05:12:05

+0

您需要提供可運行代碼。所以你需要向我們展示代碼'MeterNumber' – 2014-11-04 05:12:33

回答

0

它返回null,因爲你說它是無效的。

while (valid && i < len) { 
    char c = number.charAt(i); 
    i = i + 1; 
    if (n < 9 && Character.isDigit(c)) { 
     mn.digits[n] = c - '0'; 
     n = n + 1; 
    } else if (Character.isWhitespace(c)) { 
     // skip spaces 
    } else { //this else is the problem 
     valid = false; 
    } 
    } 

你告訴它設置valid如果它既不是空格也不是數字。由於O和P不是數字或空格,它將有效設置爲false。

if (valid && i == len && n == 9 && 
     cs/10 == mn.digits[7] && cs % 10 == mn.digits[8]) { 
    return mn; 
    } else { 
    return null; 
    } 

if語句檢查的第一件事是它是否有效。由於它不是,它返回null。

相關問題