int [] arr0 = new int [] {1 ,5 ,12 ,21 ,11 ,15 ,8 ,30} ; int [] arr2 = new int [] {2 ,3 ,12 ,9 ,17 ,30 ,25 ,35} ; // 将两个列表排序(升序) Arrays.sort(arr0); Arrays.sort(arr2); // log.info("==>{}" ,arr0); // [1, 5, 8, 11, 12, 15, 21, 30] // log.info("==>{}" ,arr2); // [2, 3, 9, 12, 17, 25, 30, 35] // 下面的比较算法只适用于两个列表长度相同时,否则应改进之 for(int i = 0 ,j = 0 ; i < arr0.length && j < arr2.length ;) { if(arr0[i] > arr2[j]) { log.info("A没有B有\t+>:{}" ,arr2[j]); j++ ; } else if(arr0[i] < arr2[j]) { log.info("A有B没有\t->:{}" ,arr0[i]); i++ ; } else { log.info("AB都有\t=>:{}" ,arr0[i]); i ++ ; j ++ ; } }
下面给出一个改进型的算法,用于解决两个列表不能同时遍历完全的情况:
// 两个比较列表 int [] arri = new int [] {1 ,5 ,12 ,21 ,11 ,72 ,15 ,8 ,30 ,17 ,43 ,21 ,56} ; int [] arrj = new int [] {2 ,3 ,12 ,9 ,17 ,30 ,25 ,35 ,21 ,41 ,58 ,72} ; // 将两个列表排序(升序) Arrays.sort(arri); Arrays.sort(arrj); List<Integer> iList = new ArrayList<Integer>() ; // i列表 List<Integer> jList = new ArrayList<Integer>() ; // j列表 List<Integer> eqList = new ArrayList<Integer>() ; // eq列表 // 下面的比较算法只适用于两个列表长度相同时,否则应改进之 int i = 0 ,j = 0 ; for(; i < arri.length && j < arrj.length ;) { if(i > 0 && arri[i - 1] == arri[i]) i++ ; // 如果当前i与上一元素相等,跳过,避免单个列表重复元素在另外一个列表中至少也存在一个时,会错误两个同时递增导致非预期结果 if(j > 0 && arri[j - 1] == arrj[j]) j++ ; // 如果当前j与上一元素相等,跳过 if(arri[i] > arrj[j]) { jList.add(arrj[j]) ; j++ ; } else if(arri[i] < arrj[j]) { iList.add(arri[i]) ; i++ ; } else { eqList.add(arri[i]) ; i ++ ; j ++ ; } } // 上面循环结束条件是i、j有一个遍历完全,所以只有三种情况 if(i == arri.length && j < arrj.length) { System.out.println("j 未完成遍历!"); // i与长度相等,说明i已遍历完全,但j小于长度,说明还有剩下的没有遍历到,原因是剩下的都比i最后一个元素要大(默认两个列表都按从小到大排序) for(int m = j ,len = arrj.length ; m < len ; m ++) { jList.add(arrj[m]) ; } } else if(i < arri.length && j == arrj.length) { System.out.println("i 未完成遍历!"); // j与长度相等,说明j已遍历完全,但i小于长度 for(int n = i ,len = arri.length ; n < len ; n ++) { iList.add(arri[n]) ; } } else { System.out.println("i、j皆完成遍历!"); // i与长度相等、j与长度相等,即两个都遍历完全 // 如果两个列表最大值相等,则一定会都遍历完全 } System.out.println("i :" + iList.toString()); // i :[1, 5, 8, 11, 15, 43, 56] System.out.println("j :" + jList.toString()); // j :[2, 3, 9, 25, 35, 41, 58] System.out.println("eq:" + eqList.toString()); // eq:[12, 17, 21, 30, 72]