有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

通过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) 个答案

  1. # 1 楼答案

    如果我们也在尝试使用相同的union代码,我们可以尝试以下代码。并集是L1和L2的完整集合,没有重复项,因此我们可以添加L1,然后添加L2时,我们需要检查结果中是否已经存在并集,然后将其添加到结果中。(假设列表中没有重复项)

    public static <X extends Comparable<? super X>> void union(List<X> L1, List<X> L2, List<X> result) {
    
    
        boolean found;    
        X number;
        X prev = null;
    
    for (int i = 0; i < L1.size(); i++) {
            result.add(L1.get(i));
    }
    for (int i=0; i<L2.size();i++){
           number = L2.get(i);
            found = binarySearch(L1, number);
    
            if (found == false ) {
                result.add(number);
            }
    }
    
    }