2014-10-06 51 views
-1

查找兩個String列表的交集。查找兩個ArrayList的交集

下面是代碼:

public ArrayList<String> intersection(ArrayList<String> AL1, ArrayList<String> AL2){ 
    ArrayList<String> empty = new ArrayList<String>(); 
    ArrayList<String> empty1 = new ArrayList<String>(); 
    if (AL1.isEmpty()){ 
     return AL1; 
    } 
    else{ 
     String s = AL1.get(0); 
     if(AL2.contains(s)) 
      empty.add(s); 


      empty1.addAll(AL1.subList(1, AL1.size())); 
      empty.addAll(intersection(empty1, AL2)); 
      return empty; 
    } 
} 

我所要的輸出是這樣的:例如,

[a, b, c] intersect [b, c, d, e] = [b, c] 

上面的代碼給我這個輸出,但我想知道如何使此代碼更易於理解。

+0

方法路口'但是我想知道如何讓這段代碼更容易理解 - 添加描述每一步的註釋? – dognose 2014-10-06 18:59:38

+0

代碼審查有http://codereview.stackexchange.com/ – sol4me 2014-10-06 19:02:40

+0

這是功課嗎? – brso05 2014-10-06 19:04:55

回答

2

你可以更容易地通過這樣寫它理解:

/** 
* Computes the intersection of two Lists of Strings, returning it as a new ArrayList of Strings 
* 
* @param list1 one of the Lists from which to compute an intersection 
* @param list2 one of the Lists from which to compute an intersection 
* 
* @return a new ArrayList of Strings containing the intersection of list1 and list2 
*/ 
public ArrayList<String> intersection(List<String> list1, List<String> list2) { 
    ArrayList<String> result = new ArrayList<String>(list1); 

    result.retainAll(list2); 

    return result; 
} 
+0

請注意,這些都不是特定於字符串的。如果由於某種原因你不能直接使用'List.retainAll()',那麼你真的應該使包裝方法成爲通用的。 – 2014-10-06 19:07:11

0
public ArrayList<String> intersection(ArrayList<String> AL1, ArrayList<String> AL2){ 
    ArrayList<String> returnArrayList = new ArrayList<String>(); 
    for(String test : AL1) 
    { 
     if(!returnArrayList.contains(test)) 
     { 
      if(AL2.contains(test)) 
      { 
       returnArrayList.add(test); 
      } 
     } 
    } 
    return returnArrayList; 
} 

你可以使用,而不是遞歸循環。

1

Java集合已通過retainAll調用支持此操作。交叉發生而不是返回一個新集合,這就是爲什麼如果要保留原始list1,您必須創建一個新的ArrayList。如果調用對象被修改retainAll返回boolean

ArrayList<String> list1 = new ArrayList<String>(); 
list1.add("A"); 
list1.add("B"); 
list1.add("C"); 
ArrayList<String> list2 = new ArrayList<String>(); 
list2.add("D"); 
list2.add("B"); 
list2.add("C"); 
ArrayList<String> intersection = new ArrayList<String>(list1); 
intersection.retainAll(list2); 
for(String s: intersection){ 
    System.out.println(s); 
} 

輸出:

B 
C