2013-08-07 24 views
2

我想联合两个通用列表,并希望产生新的列表,我以简单的格式提供我的代码。Combinig两个通用列表

public class Example{ 
    public static <E> List<E> union(List<? extends E> a,List<? extends E> b){ 
     List<Object> es= new ArrayList<Object>(); 
     for(E e:a){ 
      es.add(e); 
     } 
     for(E e:b){ 
      es.add(e); 
     } 
     return (List<E>) es; 
    } 

    public static void main(String[] args) { 
     List<Long> a=new ArrayList<Long>(); 
     a.add(1L); 

     List<Integer> b=new ArrayList<Integer>(); 
     b.add(2); 

     List<Number> list3=union(a, b);//Compilation Error due to mismatch of return type 

     List<String> a1=new ArrayList<String>(); 
     a1.add("H"); 
     List<String> a2=new ArrayList<String>(); 
     a1.add("=E"); 

     List<String> a3=union(a1, a2);//no compilation error 
    } 
} 

我的要求是我应该能够将两个整数一长串产生了一些名单,我应该能够将其他类型的结合为好。 这里的问题是关于返回类型,当我试图结合整数和长列表。我需要做些什么改变才能使我的代码正常工作。在联盟

public static <E> List<? extends E> union(List<? extends E> a, List<? extends E> b) { 
    HashSet<E> set = new HashSet<E>(); 
    set.addAll(a); 
    set.addAll(b); 
    return new ArrayList<E>(set); 
} 

这需要保留两个表中出现的一个共同要素和罕见的元素太:

回答

4

改变你的List<Number> list3=union(a, b);List<? extends Number> list3=union(a, b);,并应工作

,如果我可以提出建议,创建列表作为通用List<E> es= new ArrayList<E>();,所以你不必之前将其丢返回

+0

谢谢你的解决方案工作 – Krushna

-1
public static List<Number> union(List<? extends Number> a, List<? extends Number> b) { 

    List<Number> es = new ArrayList<Number>(); 
    for (Number e : a) { 
     es.add(e); 
    } 
    for (Number e : b) { 
     es.add(e); 
    } 
    return es; 
} 
+1

我不能让它号码,我需要其他支持,以及如String – Krushna

+1

那么它几乎就像你只是需要将列表一起加入到一个对象列表中。将“?extends Number”替换为“?”和列表到列表

-1

试试这个。 HashSet拥有独特的元素。

测试:

public static void main(String... a) { 
    List<Integer> l1 = new ArrayList<Integer>(); 
    l1.add(Integer.valueOf(0)); 

    List<Long> l2 = new ArrayList<Long>(); 
    l2.add(Long.valueOf(1)); 

    List<? extends Number> l3 = union(l1,l2); 
    System.out.println(l3); 
} 
+1

我的代码有什么问题?为什么-1? –

7

为什么不使用addAll

public static <E> List<E> union(List<? extends E> a,List<? extends E> b){ 
     List<E> es= new ArrayList<E>(); 
     es.addAll(a); 
     es.addAll(b); 
     return es; 
    } 

而且使用这样的

List<? extends Number> list = union(a, b); 
+2

你应该使用addAll,因为addAll可能被Collection的子类重写,以改善添加所有过程。例如,看看java.util.ArrayList.addAll()。它通过使用System.arraycopy()来添加所有元素。如果两个集合都是ArrayList,则这是非常快的。 arrayList1.addAll(arrayList2)。因此,addAll不仅仅是对一个集合的简单迭代,并且将这些元素添加到另一个集合中。 +1为您的答案 –

1

的情况是编译器无法找到有效的类型来解决,但你可以帮助他

List<Number> union = Example.<Number>union(intList, longList); 

如果你不想做这个只是做

List<? extends Number> union = Example.union(intList, longList); 
1

我看到两个wa伊苏:

1)

List<Number> list3 = Example.<Number>union(a, b); 

2)

List<? extends Number> list3 = union(a, b); //You can't add more objects to this list