我有30或者50个数组,选出这些数组中 共同的数字。(也就是这30个数组中全部都有的)
a[]={1,2,3,4,5,9,11}
b[]={1,4,6,3,11}
.
.
.
.
.
z[]={1,6,2,4,}
别说直接for 30-50嵌套 。这不行。可以使用任何库任何函数。咋整?

解决方案 »

  1.   

    数组中的数有一定的范围么?
    知道这个范围,并且不是很大的话,就用bitmap
    对应java.util.BitSet()
    里面的某些方法since jdk 1.5
      

  2.   

    别说直接for 30-50嵌套 。这不行。可以使用任何库任何函数。咋整?
    ---------------
    本质上,一定要做 for 30-50. 你起码要把所有的数都读一遍吧, 读一遍就必须做30-50的for循环。
    或者说,用集合求交集的办法,全部求交集就好了,不过,那个本质上还是做了 for 30-50的循环。我们可以假设最快的办法是这样: 每个数组就是一个带子,数组里有的数字就在带子上对应位置打个孔;最后结果就是把所有带子都叠在一起,能从头通到底的那几个位置上的数字。
    可是,你还是要for 30-50的循环来把“带子”打好孔吧?或者,先求第一个和第二个数组的交集,然后依次在后面的带子上找有重复的--可是,还是要for 30-50来遍历每个数字吧?可以说,先排序了,以后找起来就快,可以2分,可以快速,---可以,还是要先 for 30-50的循环,把所有数组都排好序吧?
      

  3.   


    int[][] iss=new int[][]{//
    {1,2,3,4,5,9,11},//
    {1,4,6,3,11},//
    {1,2,3,9,11},//
    };
    HashMap<Integer,Integer> sMap=new HashMap<Integer,Integer>();
    HashMap<Integer,Integer> dMap=new HashMap<Integer,Integer>();
    if(iss.length>0){
    int[] is=iss[0];
    for(int i:is){
    sMap.put(i,null);
    }
    for(int p=1;p<iss.length;p++){
    is=iss[p];
    for(int i:is){
    if(sMap.containsKey(i)){
    dMap.put(i,null);
    }
    }
    sMap.clear();
    HashMap<Integer,Integer> t=sMap;
    sMap=dMap;
    dMap=t;
    }
    }
    for(Integer i:sMap.keySet()){
    System.out.print(i+",");
    }
    System.out.println();