繁体   English   中英

关于java集合和泛型:

[英]About java Collections and generics:

我得到了以下学校作业:
给定两个可比较项目的排序列表L1L2

  • (a)在Java中实现一种方法来确定L1L2是否是不交连的列表。
  • (b)在Java中实现一种方法来计算差异(\\)
    L1L2之间。 L1 \\ L2 = {x | x∈L1和x∉L2}。
  • (c)您的方法的运行时间复杂度是多少? 自圆其说。

注意:对于此问题,您只能使用Java Collections API基本方法。

考虑到我仍在学习java泛型和通配符,并且还没有完全掌握这个概念,我已经回答了两个问题,但是找到了解决问题(b)的两种可能的方法。

这是我对问题(a)的回答:

public static final <T> boolean disjoint(List<? extends T> list1, List<? extends T> list2 ){
        return Collections.disjoint(list1, list2);
    }

如果两个列表都不相交,则此方法可以有效回答。 并按照要求使用Collections.disjoint。

例如:

List<Float> lista = Arrays.asList(2.3f, 3.4f);
List <Object> listb = Arrays.asList("a","b","c","d", 1, 2, 3, 3.4f);

System.out.println(SetList.disjoint(list1, list9));//prints false;

现在,对于(b)部分,我首先创建了以下方法:

public static final <T> List<? super T> 
                              setDifference(List<? extends T> list1, List<? extends T> list2){

            List<? super T> resultSet = new ArrayList<>();

            for(T x : list1){
                if(!list2.contains(x)){
                    resultSet.add(x);
                }
            }
            return resultSet;
    }

这种方法使我可以执行以下操作:

List <Object> list1 = Arrays.asList(1.2f,12f, "a","b","c","d", 1,2,3,3.4f);
List<Float> list9 = Arrays.asList(2.3f, 3.4f);

System.out.println(SetList.setDifference(list1, list9));
//Prints [1.2, 12.0, a, b, c, d, 1, 2, 3]

或这个:

List<Integer> list3 = Arrays.asList(1,2,3,4,10);
List<Float> list9 = Arrays.asList(2.3f, 3.4f);
System.out.println(SetList.setDifference(list3, list9));
// this prints [1, 2, 3, 4, 10]

现在,由于问题表明列表是可比较的项目,因此我天真地假定我必须在此方法的签名中加入可比较的内容,因此我实现了以下内容:

public static final <T extends Comparable<? super T>> List<? super T> 
                              setDifference2(List<? extends T> list1, List<? extends T> list2){

        List<T> resultSet = new ArrayList<>();

        for(T x: list1){
            if(Collections.binarySearch(list2, x)<0){
                resultSet.add(x);
            }
        }
        return resultSet;
    }  

但是,有了这个签名,似乎我只能接受具有相同类型的列表,在我可以接受类型对象列表和整数列表等之前,情况并非如此。

看来现在我只能使用相同类型的列表。 我真的不知道那是我从一开始就打算解决的问题。

我知道二进制搜索可以改善此问题的性能,但是这样做是以牺牲对方法输入的限制为代价的吗?
另外,我是否对这些方法签名和Lists声明正确使用了通配符?

我最近开始阅读这本书: Maurice NaftalinPhilip Wadler 撰写的 Java Generics and Collections ,我正尝试遵循本书中的建议, getsputs原理等,希望得到一些建议并咨询我提出的这些答案,并也有人建议进一步阅读,使我可以更好地学习该主题。

我知道二进制搜索可以改善此问题的性能,但是这样做是以牺牲对方法输入的限制为代价的吗?

是。

另外,我是否对这些方法签名和Lists声明正确使用了通配符?

是。

回应@shmosel,这是对(a)部分的更好回答吗?

public static final <T extends Comparable<? super T>> 
                      boolean disjoint2(List<? extends T> list1, List<? extends T>list2){
    for(T x: list1){
        if(Collections.binarySearch(list2, x)>=0){
            return false;
        }
    }   
    return true;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM