【问题标题】:Can someone help me fix this toString method please有人可以帮我解决这个 toString 方法吗
【发布时间】:2014-11-04 05:10:19
【问题描述】:

我有一个将字符串转换为 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());

提前致谢。

【问题讨论】:

  • 什么是MeterNumber
  • 这是一个九位数字
  • 您需要提供可运行代码。所以你需要向我们展示MeterNumber的代码
  • 请原谅我的无知,但是否有一些要求阻止您使用 Double.parseDouble() 和 Integer.parseInt()?
  • @RuchiraGayanRanaweera 我编辑了我的问题以包含所涉及的代码

标签: java java.util.scanner


【解决方案1】:

它返回 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 不是数字或空格,因此将 valid 设置为 false。

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

if 语句检查的第一件事是它是否有效。既然不是,就返回null。

【讨论】:

    猜你喜欢
    • 2018-08-13
    • 2015-05-31
    • 2016-07-09
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多