有人可以帮我解决这个toString方法吗

时间:2014-11-04 05:10:20

标签: java java.util.scanner

我有一个将字符串转换为MeterNumber的方法。代码如下。

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

}

这是从我的main方法调用的代码:

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

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

提前致谢。

1 个答案:

答案 0 :(得分: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设置为false。由于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。