1

背景描述在最后。

简而言之,为什么下面的 foror 循环对 yearInt 0-8 有效,但是当 yearInt 变量为 9 时,循环变得无穷无尽?

     int yearInt = 9;//scanned year - for testing        
    int currentYearFourNumbers = Calendar.getInstance().get(Calendar.YEAR); // current year

    currentYearFourNumbers = 2023; // for testing!! 

   int currentYearLastDigit=currentYearFourNumbers%10; //mod operator for getting last digit of current year 
    int resultYear = currentYearFourNumbers;    //init int result which will represent the identified year 
    int checkNumber = currentYearLastDigit; //counter or check number for for loop

       for (int i = yearInt; i != checkNumber; checkNumber--){

           checkNumber = resultYear%10;
            System.out.println (checkNumber);
            System.out.println (i);
           resultYear = resultYear -1; 
           System.out.println (resultYear);
       }

如果我有 8 它可以工作,请参阅输出:

检查:3 针对8 2022 检查:2 针对8 2021 检查:1 针对8 2020 检查:0 针对8 2019 检查:9 针对8 2018 制造日期2018

背景:

我需要创建逻辑来确定应根据一位数将哪一年输入数据库。该数字是设备扫描序列号的一部分,代表制造年份。

数字 4 现在应该代表 2004 年,但明年应该代表 2014 年。逻辑应该在 2020 年也有效,所以我需要一个“永久”解决方案。

为此,我创建了一个 foo 循环,该循环获取扫描的数字并将其与当前年份的最后一位数字进行比较。然后我减去(设备不能有未来日期)一年,直到一年的最后一位数字与扫描的年份相同。

4

3 回答 3

3

让我们看看这里:

for (int i = yearInt; i != checkNumber; checkNumber--){
     checkNumber = resultYear%10;
     System.out.println (checkNumber);// In here you are just giving it the initial value again.
     System.out.println (i);
     resultYear = resultYear -1; 
     System.out.println (resultYear);
}

因此,您的循环将执行 while i != checkNumber,并checkNumber在每次迭代时递减。但如果checkNumber < i开始呢?这就是你的无限循环的来源。如果i > checkNumber从一开始,checkNumber就永远不会== i

在你的情况下,checkNumber3。你的循环应该i--没有checkNumber--

对于更简单的解决方案:

public static int getFinalYear(int digit) {
    int year = 2013;
    int finalYear = year;
    int lastYear = year % 10;
    if (digit > lastYear) {
        finalYear += (digit - lastYear) - 10;
    } else {
        finalYear -= lastYear - digit;
    }
    return finalYear;
}

它没有经过彻底测试,但请看一看。

System.out.println(getFinalYear(1));// 2011
System.out.println(getFinalYear(2));// 2012
System.out.println(getFinalYear(3));// 2013
System.out.println(getFinalYear(4));// 2004
System.out.println(getFinalYear(5));// 2005
System.out.println(getFinalYear(6));// 2006
System.out.println(getFinalYear(7));// 2007
System.out.println(getFinalYear(8));// 2008
System.out.println(getFinalYear(9));// 2009
于 2013-05-07T08:47:22.423 回答
1

问题是你没有注意到 for 循环是如何工作的。

根据Orcale.com上的 Java 教程

在循环的每次迭代之后调用增量表达式。

这就是您的代码的工作方式,在每次 for 迭代中,for 语句都会减少 checkNumber。我已经调试并看到当 i 为 9 且 checkNumber 为 9 时 for 应该终止但 for 语句首先减少 chechNumber 然后处理标准。

我已将您的代码更改为下面的代码,它解决了无限问题。

// the value of checkNumber should check before decrement! 
for (int i = yearInt; i != checkNumber --; ){

    checkNumber = resultYear%10;
    System.out.println (checkNumber);
    System.out.println (i);
    resultYear = resultYear -1;
    System.out.println (resultYear);
}

我希望它有帮助:)

于 2013-05-07T09:09:10.170 回答
1

在java中,增量/减量语句(在你的情况下checkNumber--)总是在条件语句之前评估,除了第一次迭代。

在您的情况下,当 checkNumber9在 for 循环内时,它会8在比较之前递减。

像这样的东西应该适用于您的情况-

for (int i = yearInt; i != checkNumber;){
  checkNumber = resultYear%10;
  System.out.println (checkNumber);
  System.out.println (i);
  resultYear = resultYear -1; 
  System.out.println (resultYear);
  if(checkNumber==0){//whenever checknumber is 0, it should be set to 9 
    checkNumber=9;
  }else{
    checkNumber--;
  }
}

上面只是一个避免无限循环的例子。您可能需要根据您的业务需求进一步修改代码。

于 2013-05-07T08:57:22.913 回答