2014-10-06 47 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