2014-01-28 58 views
0

当我跑,我得到这样的:计算阵列交汇的独特元素的数量

运行assignment1question1

应该回到“2”,因为我试图找到两个数组相交中唯一元素的数量。请帮忙。 谢谢。

public class assignment1question1 { 
    public static void main(String[] args) { 
     int[] a = {1,3,2,3,5}; 
     int[] b = {1,3,4,1,7,3}; 
     int n = 5; 
     int m = 6; 
     System.out.print(listIntersection(a,b,n,m)); 
    } 
    public static int listIntersection (int[] a, int[] b, int n, int m) { 
     int i,j,k; 
     int intersect = 0; 

     for(i=0; i<n; i++) { 
      int duplicate = 0; 

      for(j=0; j<=i; j++) { 
       if(a[i] == a[j]) { 
        duplicate = duplicate + 1; 
       } 
      } 
      if(duplicate == 1) { 
       for(k=0; k<m; m++) { 
        if(a[i] == b[k]) { 
         intersect = intersect + 1; 
        } 
       } 
      } 
     } 
    return intersect; 
    } 
} 

这是我更新的代码:

public class assignment1question1 { 
    public static void main(String[] args) { 
    int[] a = {1,3,2,3,5}; 
    int[] b = {1,3,4,1,7,3}; 
    int n = a.length; 
    int m = b.length; 
    System.out.print(listIntersection(a,b,n,m)); 
    } 
    public static int listIntersection (int[] a, int[] b, int n, int m) { 
     int i,j,k; 
     int intersect = 0; 

     for(i=0; i<n; i++) { 
     int duplicate = 0; 

     for(j=1; j<=i; j++) { 
      if(a[i] == a[j]) { 
      duplicate = duplicate + 1; 
     } 
     } 
     if(duplicate == 0) { 
      for(k=0; k<m; k++) { 
      if(a[i] == b[k]) { 
       intersect = intersect + 1; 
       break; 
      } 
      } 
     } 
     } 
    return intersect; 
    } 
    } 
+1

为什么你'N'和'M'而不是使用'a.length'和'b.length'? –

+1

2147483642 *在Java中几乎是* int(它是带符号的)的最大值。所以有理由认为你的'intersect = intersect + 1'语句被重复执行,直到它不能再被增加。尝试从内到外调查什么会导致这种情况。 –

+1

在最后一个for循环中,您正在增加“m”,必须增加“k” –

回答

0

如果你想让你的代码工作,你将需要修复k for-cycle,在那里你迭代b数组。

  if(duplicate==1) { 
       for(k=0; k<m; k++) { // increase k 
        if(a[i] == b[k]) { 
         intersect = intersect + 1; 
         break; // insert break to avoid duplicates in b array 
        } 
       } 
      } 

而且这里有点清洁和更短的代码。 (我想,你是不是允许使用Java集合类。)

public class assignment1question1 { 

    public static void main(String[] args) { 
     int[] a = {1,3,4,3,5}; 
     int[] b = {1,3,4,1,7,3}; 
     System.out.print(listIntersection(a,b)); 
    } 

    public static int listIntersection(int[] a, int[] b) { 
     int intersect = 0; 

     for(int i = 0; i < a.length; i++) { 
      boolean duplicate = false; 

      for (int j = 0; j < i; j++) { 
       if(a[i] == a[j]) { 
        duplicate = true; 
        break; 
       } 
      } 

      if (!duplicate) { 
       for(int k = 0; k < b.length; k++) { 
        if (a[i] == b[k]) { 
         intersect++; 
         break; 
        } 
       } 
      } 
     } 
     return intersect; 
    } 
} 
+0

找到问题,这是真的,我可以写从j = 1开始,而不是0,然后使条件复制== 0. – Silent

+0

我错了。你需要修理你的'k'形式。 –

+0

不,我认为你是对的。我碰巧做出了与您展示的相同的修改。我现在的代码是? – Silent

0

你被卡在无限循环becoz你增加M值是M +:

if(duplicate == 1) { 
        for(k=0; k<m; k++) { 
         if(a[i] == b[k]) { 
          intersect = intersect + 1; 
         } 
        } 
       } 
+0

完整的错字...该死的。谢谢。意思是写k ++ – Silent

+0

@ user3245760是的,它似乎。通过添加日志 – Kick

0
import java.util.HashSet; 
import java.util.Set; 

public class Del { 
    public static void main(String[] args) { 
     int[] a = { 1, 3, 2, 3, 5 }; 
     int[] b = { 1, 3, 4, 1, 7, 3 }; 

     // duplicates removed by SET 
     Set intersect = new HashSet(); 

     for (int aVal : a) { 
      for (int bVal : b) { 
       if (aVal == bVal) { 
        intersect.add(aVal); 
        System.out.println("->" + aVal); 
       } 
      } 
     } 
     System.out.println("Size =" + intersect.size()); 
    } 
} 
0
import java.util.*; 

public class HelloWorld { 

    public static void main(String []args) { 
     int[] a = {1,3,2,3,5}; 
     int[] b = {1,3,4,1,7,3}; 
     Set<Integer> aTmp = asSet(a); 
     aTmp.retainAll(asSet(b)); 
     System.out.println(aTmp.size()); 
    } 

    public static Set<Integer> asSet(int... args) { 
     Set<Integer> tmp = new HashSet<Integer>(); 
     for (int i : args) { 
      tmp.add(i); 
     } 
     return tmp; 
    } 
}