2016-06-10 76 views
1

我已經給予了以下作業:
鑑於兩個可比排序的項目列表,L1L2關於Java集合和泛型:

  • (一)實現在Java中確定的方法如果L1L2是不相交列表。 (b)在Java中實現一種方法來計算L1L2之間的差異(\)
    。 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泛型和集合,則得到提出原則等,會喜歡一些建議和諮詢我提出的這些答案,還有一些建議進一步閱讀,這將使我能夠更好地學習這一主題。

+0

不知怎的,我懷疑調用'Collections.disjoint()'是不是你分配的初衷是什麼? – shmosel

回答

2

我明白,二進制搜索提高了這個問題的性能,但它是以犧牲它對方法輸入施加的限制爲代價嗎?

是的。

另外我是否正確使用這些方法的通配符簽名和列表聲明?

是的。

+0

這是因爲對象不實現java.lang.Comparable的,對不對? @shosel –

+1

@CarlosLuis正確。但限制要進一步。你不能輸入'List '與'List '一起輸入'因爲'不能相互比較。 – shmosel

0

回覆@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; 
} 
+0

看起來不錯。 – shmosel