0

我正在实施一个程序以从 2 个字符数组中删除重复项。我实现了这两个解决方案,解决方案 1 运行良好,但解决方案 2 给了我 UnSupportedOperationException。为什么呢?错误在行al1.removeAll(al2);

public void getDiffernce(Character[] inp1, Character[] inp2){

    // SOLUTION 1:
    // **********************************************

    List<Character> list1 = new ArrayList<Character>(Arrays.asList(inp1));
    List<Character> list2 = new ArrayList<Character>(Arrays.asList(inp2));
    list1.removeAll(list2);

    System.out.println(list1);
    System.out.println("***************************************");


    // SOLUTION 2:

    Character a[] = {'f', 'x', 'l', 'b', 'y'};
    Character b[] = {'x', 'b','d'};

    List<Character> al1 = new ArrayList<Character>(); 
    List<Character> al2 = new ArrayList<Character>(); 
    al1 = (Arrays.asList(a)); System.out.println(al1);
    al2 = (Arrays.asList(b)); System.out.println(al2);  
    al1.removeAll(al2);         // error is here     
    System.out.println(al1);
}
4

3 回答 3

3

asList(..)文档中:

返回由指定数组支持的固定大小的列表。(更改返回的列表“直写”到数组。)此方法与 Collection.toArray() 结合,充当基于数组和基于集合的 API 之间的桥梁。返回的列表是可序列化的并实现了 RandomAccess。

基本上,该asList方法不会创建普通的可变对象List<E>,而是创建数组周围的包装器。因此,该remove操作在由数组支持的列表上不可用。

尝试通过手动构建列表来构建它们:

List<Character> al1 = new ArrayList<Character>(Arrays.asList(a)) 

这样支持的列表仅用于初始化一个真实的ArrayList.

于 2013-06-26T15:07:39.397 回答
3

Arrays.asList()返回一个固定大小的列表。不能添加或删除任何条目。

您可以通过以下方式解决此问题:

al1 = new ArrayList<Character>((Arrays.asList(a))); 

和同样的al2

这已经在顶级解决方案中发生了。

在第二个中,您创建一个 ArrayList 然后用固定的覆盖它,而不是填充它,保持可变。

于 2013-06-26T15:08:02.910 回答
0

你用Arrays.asList(). 而且这种类型的列表是不可修改的。

javadoc明确表示:

返回由指定数组支持的固定大小的列表。[强调我的]

于 2013-06-26T15:08:02.077 回答