0

用户输入年份并将其存储在year. 并且调用了一个方法来计算并返回将在一周中的同一天的下一年。月份和日期不会仅更改年份。在这种情况下,月份为 Jan,日期为 1。

/**
 * @param theYear the year given
 */
public int yearSync(int theYear)
{
   int month = 1;
   int day = 1;
   int year = theYear;

   int aMonth = 1;
   int aDay = 1;
   int aYear = year++;

   Date d1 = new Date(month, day, year);
   Date d2 = new Date(aMonth, aDay, aYear);

   boolean valid = false;       

   while (!valid)
   {
      if(d1.getDayOfWeek().equals(d2.getDayOfWeek)))//another class provided is used to 
      {                                             //calc what day of the week it is
         System.out.println(aYear); //prints the year
      }                             //that falls on the same week day as the input year
      else
      {
         aYear++;
      }
   }
   return aYear;
}

不要求答案只是想知道我的逻辑错误在哪里,以及在处理此类问题时我可以做些什么来改变我的思维过程。如果有任何混淆,例如,如果我输入 2014,则返回的年份为 2020;他们都在星期三跌倒。

编辑:更改循环类型。

4

4 回答 4

1

你的循环for (int i = 0; i <= i++; i++)永远不会停止......

第一次通过,i设置为0,条件为i < i++,将i的值变为i+1,但比较成功。

所以第一次通过循环时, 的值为i1。在循环结束时,它会因为i++(值 2)而增加它,然后它会再次比较它i <= i++会通过,但也会将 i 设置为 3。

因此,在您的循环中,该值i将是 1、3、5、7、...。

这个循环条件非常奇怪,但是,这并不是真正的问题......因为它本质上与:

while (true) {...}

奇怪的是,当您实际上找到具有相同 yad-of-week 的年份时,您不会增加年份,即一旦您找到第一个匹配项,aYear++ 就永远不会改变,然后您就System.out.println(...)永远重复同样的事情.

但是同样,这一切都毫无意义,因为您永远不会更改d2循环内的日期值.....

你想要的是这样的:

while(true) {
    aYear++;
    Date d2 = new Date(aMonth, aDay, aYear);
    if (d1.getDayOfWeek().equals(d2.getDayOfWeek)))//another class provided is used to 
    {                                             //calc what day of the week it is
        System.out.println(aYear); //prints the year
        return aYear;
    }
}
于 2013-11-12T03:13:07.360 回答
0

您只是在增加aYear变量,但d2引用将始终保持aYear创建时的初始值。因此,您还需要在 for 循环中更新d2参考,以便在每个循环迭代中都有下一年。

此外,一旦找到所需的年份,您就需要打破循环。这是更新的 for 循环,希望它有效:

 //for sake of this question I will use a for loop
   for (int i = 0; i <= i++; i++)
   {
      if(d1.getDayOfWeek().equals(d2.getDayOfWeek)))//another class provided is used to 
      {                                             //calc what day of the week it is
         System.out.println(aYear); //prints the year
         break;
      }                             //that falls on the same week day as the input year
      else
      {
         aYear++;
      }
      d2 = new Date(aMonth, aDay, aYear);
   }
   return aYear;
}
于 2013-11-12T03:09:36.893 回答
0

好吧,你的循环将永远持续下去。你有:

for (int i = 0; i <= i++; i++) { ... }

这相当于:

int i = 0;
while (i <= i++) {
    ...
}

i++它的作用是评估为,i并且增量i为 1。为了让它更明显,让我们将i++正在做的事情分解成多个语句:

int i = 0;
while (true) {
    //left-hand-side is 'i'
    int leftHandSide = i;
    //right-hand-side is 'i++' which evaluates to 'i' and then 'i' is incremented
    int rightHandSide = i;
    i += 1;
    if (leftHandSide <= rightHandSide) {
        break;
    }
    ...
}

如果你注意到这只是比较i <= i,这总是正确的,所以循环永远不会中断。

于 2013-11-12T03:10:49.353 回答
0

您可以使用它从两个数组中查找匹配值。添加 getDayofWeek() 以及您需要的任何其他内容。

     for(int x : d1){

         //Some counter = 0;  

        for(int y : d2) {  
           if(x.equals(y))
           //counter++;
       }
        System.out.println(y);

       }}
于 2013-11-12T03:19:09.480 回答