在实际应用中,有时候会遇到一个数组有两部分数组组成,,知道其中一部分求出另一部分,也就是补集,可以用List中的removeAll方法,如果用算法该如何实现呢?这里给大家分享一个自己写的Java算法,如果有问题还希望大家指出.
public class A {
public static void main(String[] args) {
int contain[]={3,4,5};
int total []={1,4,4,5,6,7,5,3};
int remain[]=new int [total.length-contain.length];
int k=0;
for (int i = 0; i < total.length; i++) {
boolean flag=true;
for (int j = 0; j < contain.length; j++) {
if(total[i]==contain[j]){
flag=false;
break;
}
}
if (flag) {
remain[k++]=total[i];
}
}
System.out.println(Arrays.toString(remain));
}
}
以上这段代码的思路就是total中元素依次跟contain中的比较,如果contain中都不存在则添加到新数组中去,这样可以把补集数组求出,但是有个限制条件,就是total中的数组如果有跟contain中的元素且有重复的元素时,会都被删除,例如若int contain[]={3,4,5},int total []={1,4,4,5,6,7,5,3}的话,则打印结果为[1, 6, 7, 0, 0]。如果想要将有重复元素的total数组求出正确的补集该怎么做呢?请看以下代码:
import java.util.Arrays;
public class B {
public static void main(String[] args) {
int contain[]={3,4,5};
int total []={1,4,4,5,6,7,5,3};
int remain[]=new int [total.length-contain.length];
int k=0;
if (remain.length>0) {
for (int i = 0; i < total.length; i++) {
boolean flag=true;
int j=0;
while (j<contain.length) {
if(total[i]==contain[j]){
contain=remove(contain,j);
flag=false;
break;
}
j++;
}
if (flag) {
remain[k++]=total[i];
}
}
}
System.out.println(Arrays.toString(remain));
}
public static int[] remove(int[]Array,int index){
int [] newArray=new int[Array.length-1];
int j=0;
for (int i = 0; i < Array.length; i++) {
if (i!=index) {
newArray[j++]=Array[i];
}
}
return newArray;
}
这里新加了个remove方法,思路是当contain中遇到与total中的相同元素时,将contain中的此元素删掉,这样就可以避免遇到上面的问题了。这时的打印结果为[1, 4, 6, 7, 5]。