最后描述了背景。
简而言之,为什么下面的foor循环适用于yearInt 0-8但是当yearInt varliable是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 against8 2022 检查:2 against8 2021 检查:1 against8 2020 检查:0 against8 2019 检查:9 against8 2018 制造日期2018
背景:
我需要创建逻辑来确定哪一年应该基于一位数输入数据库。 数字是来自设备的扫描序列号的一部分,代表制造年份。
数字4现在应该代表2004年,但明年应该代表2014年。 逻辑应该在2020年也有效,所以我需要一个“permament”解决方案。
我因此创建了一个foor循环,它接受扫描的数字并将其与当前年份的最后一位数字进行比较。然后我每年减去(设备不能有未来日期),直到一年的最后一位数与扫描年份相同。
答案 0 :(得分: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);
}
因此,您的循环将在i != checkNumber
时执行,并且checkNumber
在每次迭代时递减。但如果开始checkNumber < i
该怎么办?这就是你的无限循环来自哪里。如果从i > checkNumber
开始,checkNumber
永远不会是== i
。
在您的情况下,checkNumber
为3
。你的循环可能应该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
答案 1 :(得分:1)
在java中,增量/减量语句(在你的情况下为checkNumber--
)总是在条件语句之前进行求值,除了第一次迭代。
在你的情况下,当for循环中的checkNumber为9
时,它会在比较之前递减到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--;
}
}
以上只是避免infinte循环的一个例子。您可能需要根据业务需求进一步修改代码。
答案 2 :(得分:1)
问题是你没有注意到for循环是如何工作的。
的Java教程每次迭代循环后都会调用increment表达式。
这是您的代码的工作方式, 在每次迭代中,for语句减少checkNumber。我已经调试并且看到当我是9并且checkNumber是9时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);
}
我希望它有所帮助:)。