我的循环中的逻辑不正确

时间:2015-08-14 18:21:21

标签: java arrays loops arraylist

public static void main(String[] args) {
        Integer[] courses1 = {1,2,3};
        Integer[] courses2 = {0,1};

        Integer[] longestArr;
        Integer[] shortestArr;
        ArrayList commonCourses = new ArrayList();

        if ( courses1.length > courses2.length)
        {
            longestArr = courses1; shortestArr = courses2;
        }    
        else
        {    
            longestArr = courses2; shortestArr = courses1;
        }

        for ( int i : longestArr)
        {
            for ( int j : shortestArr)
            {
                if (i == j);
                   commonCourses.add(i); 
            }
        } 
        Collections.sort(commonCourses);
        System.out.println(commonCourses.size());


}

无论course1和courses2的值是什么,arrayList commonCourses的大小都是两个数组中元素总数的一个,当它应该只包含两个数组中的元素时。

我有2个问题为什么要将2个数组中的元素添加到arrayList中,为什么arrayList的大小总是比元素总数多一个?

如果您想知道为什么我在开始时声明了course1和courses2,那么我在pantclipse上测试时遇到的问题就是来自talentBuddy.co的问题。我已经测试了不同的起始条件,同样的事情总是发生。

我新的精简解决方案

public static void main(String[] args) {
        Integer[] courses1 = {1};
        Integer[] courses2 = {0};

        ArrayList <Integer>commonCourses = new ArrayList<Integer>();

        for ( int i : courses1)
        {
            for ( int j : courses2)
            {
                if (i == j)
                   commonCourses.add(i); 
            }
        } 
        Collections.sort(commonCourses);
        System.out.println(commonCourses.size());     
}

3 个答案:

答案 0 :(得分:3)

您的问题是此行中的分号:

if (i == j);

if子句在此结束,并且始终执行以下行。

答案 1 :(得分:2)

if条件结束时的分号是你的问题。有关为何发生这种情况的详细说明,请参阅this StackOverflow post.简而言之,分号会导致编译器在运行时忽略条件。

for ( int j : shortestArr)
{
    if (i == j);
    //         ^  Remove this semi-colon
    commonCourses.add(i); 
}

使用花括号来格式化if语句有助于防止这种情况发生:

if(condition){
    doSomething();
}

答案 2 :(得分:1)

 for ( int j : shortestArr)
 {
      if (i == j);
              // ^ REMOVE THIS SEMICOLON
           commonCourses.add(i); 
 }

问题是额外的分号。您的代码块现在在功能上与此相同:

 for ( int j : shortestArr)
 {
      if (i == j)
      {
      }

      commonCourses.add(i); 
 }