[英]About java Collections and generics:
我得到了以下学校作业:
给定两个可比较项目的排序列表L1和L2
注意:对于此问题,您只能使用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 Naftalin和Philip Wadler 撰写的 Java Generics and Collections ,我正尝试遵循本书中的建议, gets和puts原理等,希望得到一些建议并咨询我提出的这些答案,并也有人建议进一步阅读,使我可以更好地学习该主题。
我知道二进制搜索可以改善此问题的性能,但是这样做是以牺牲对方法输入的限制为代价的吗?
是。
另外,我是否对这些方法签名和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.