我已經給予了以下作業:
鑑於兩個可比排序的項目列表,L1和L2關於Java集合和泛型:
- (一)實現在Java中確定的方法如果L1和L2是不相交列表。 (b)在Java中實現一種方法來計算L1和L2之間的差異(\)
。 L1 \ L2 = {x | x∈L1和x∈L2}。 - (c)你的方法的運行時間複雜度是多少?自圓其說。
注意:對於此問題,您只能使用Java 收藏集 API基本方法。
我已經回答了這兩個問題,但發現問題(二)的兩種可能的解決方案,因爲我仍然在學習Java泛型和通配符,並且還沒有完全理解這個概念。
這是我回答的問題(一):
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;
}
然而與此簽名似乎我只能列出具有相同類型的列表,在之前我可以列出類型對象列表和整數列表等情況並非如此。
看來現在我只能使用相同的列表類型。我真的不知道這是否是自從一開始就打算讓我做的問題。
我知道二進制搜索提高了這個問題的性能,但它是以犧牲它對方法輸入施加的限制爲代價的嗎?
我也在正確使用這些方法簽名和列表聲明的通配符?
最近,我開始讀的書:由莫里斯·納夫特爾林和菲利普·沃德勒,我試圖按照從書的建議Java泛型和集合,則得到和提出原則等,會喜歡一些建議和諮詢我提出的這些答案,還有一些建議進一步閱讀,這將使我能夠更好地學習這一主題。
不知怎的,我懷疑調用'Collections.disjoint()'是不是你分配的初衷是什麼? – shmosel