我正在尝试编写一个方法union(),它将返回一个int数组,它需要两个int数组参数并检查它们是否是集合,或者换句话说,它们之间是否有重复项。我编写了另一个方法isset(),它接受一个数组参数并检查数组是否是一个集合。问题是我想检查union方法中的两个数组之间是否有重复项,如果有,我想提取其中一个重复项并将其放入unionarray[]int数组中。这就是我目前所尝试的。
public int[] union(int[] array1, int[] array2){
int count = 0;
if (isSet(array1) && isSet(array2)){
for (int i = 0; i < array1.length; i++){
for (int j = 0; j < array2.length; j++){
if (array1[i] == array2[j]){
System.out.println(array2[j]);
count ++;
}
}
}
}
int[] array3 = new int[array2.length - count];
int[] unionArray = new int[array1.length + array3.length];
int elementOfUnion = 0;
for (int i = 0; i< array1.length; i++){
unionArray[i] = array1[i];
elementOfUnion = i + 1 ;
}
int index = 0;
for (int i = elementOfUnion; i < unionArray.length; i++){
unionArray[i] = array3[index];
index++;
}
return unionArray;
}
public boolean isSet(int[] array){
boolean duplicates = true;
for (int i = 0; i < array.length; i++){
for(int n = i+1; n < array.length; n++){
if (array[i] == array[n])
duplicates = false;
}
}
return duplicates;
}
我要做的是使用unionarray中的所有array1元素,检查array2是否与array1重复,然后将所有不重复的元素从array2移动到新的array3,并将array3连接到unionarray。
3条答案
按热度按时间lc8prwob1#
即使只使用数组有各种限制,也可以大大简化代码。不需要检查
sets
. 只是:分配一个数组来存储联合的所有元素(即。,
int[] tmp_union
),最坏情况下将是两个数组中的所有元素array1
以及array2
.迭代
array1
把它们和tmp_union
数组,将它们添加到tmp_union
仅当它们尚未添加到该数组时。重复2)对于
array2
.在此过程中,请跟踪添加到
tmp_union
迄今为止的阵列(即。,added_so_far
). 最后,从tmp_union
将数组放入新数组(即。,unionArray
)只为并集元素分配了空间。代码如下所示:ltskdhd12#
使用java的流可以使这变得非常简单:
tcbh2hod3#
这样做会容易得多
Collection
api或Stream
应用程序编程接口。但是,您已经提到,您希望只使用数组而不导入任何类,这将需要几个冗长(尽管很简单)的处理单元。驱动逻辑的最重要的理论是如何(如下所示)计算并集:和
此解决方案的高级摘要如下图所示:
代码本身的注解已经非常清楚地提到了其余的逻辑。
输出: