通过Java Collections API基本方法合并两个排序列表
所以我需要两种方法来计算两个可比较项的排序列表的并集和交集。我已经完成了交集代码,你可以在下面看到,我正在使用二进制搜索来完成这项工作。但我有点被困在问题的工会部分,不确定如何解决它,有什么想法或帮助吗
public class UnionAndIntersection {
public static <X extends Comparable<? super X>> void intersection(List<X> L1, List<X> L2, List<X> result) {
boolean found;
X number;
X prev = null;
for (int i = 0; i < L1.size(); i++) {
number = L1.get(i);
found = binarySearch(L2, number);
if (found == true && prev != number) {
result.add(number);
prev = number;
}
}
}
public static <X extends Comparable<? super X>> void union(List<X> L1, List<X> L2, List<X> result) {
}
public static <X extends Comparable<? super X>> boolean binarySearch(List<X> allNumbers, X number, int first, int last) {
if (first > last) {
return false;
} else {
int middle = (first + last) / 2;
int compResult = number.compareTo(allNumbers.get(middle));
if (compResult == 0) {
return true;
} else if (compResult < 0)
{
return binarySearch(allNumbers, number, first, middle - 1);
} else
{
return binarySearch(allNumbers, number, middle + 1, last);
}
}
}
public static <X extends Comparable<? super X>> boolean binarySearch(List<X> allNumbers, X number) {
return binarySearch(allNumbers, number, 0, allNumbers.size() - 1);
}
public static void display(List list) {
for (Object object : list) {
System.out.print(object + " ");
}
}
public static void main(String[] args) {
List<Integer> L1 = new ArrayList<>();
List<Integer> L2 = new ArrayList<>();
List<Integer> result1 = new ArrayList<>();
List<Integer> result2 = new ArrayList<>();
L1.addAll(Arrays.asList(1, 2, 3, 4, 5));
L2.addAll(Arrays.asList(2, 4, 6, 8, 10));
intersection(L1, L2, result1);
System.out.print("Intersection of the two lists is: ");
display(result1);
System.out.print("\n");
union(L1, L2, result2);
System.out.print("Union of the two lists is: ");
display(result2);
}
}
# 1 楼答案
如果我们也在尝试使用相同的union代码,我们可以尝试以下代码。并集是L1和L2的完整集合,没有重复项,因此我们可以添加L1,然后添加L2时,我们需要检查结果中是否已经存在并集,然后将其添加到结果中。(假设列表中没有重复项)