我正在实施一个程序来删除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);
}
答案 0 :(得分:3)
来自asList(..)
文档:
返回由指定数组支持的固定大小的列表。 (对返回列表的更改“直写”到数组。)此方法与Collection.toArray()结合,充当基于数组的API和基于集合的API之间的桥梁。返回的列表是可序列化的,并实现RandomAccess。
基本上asList
方法不会创建正常的可变List<E>
,而是创建数组的包装器。因此,remove
操作在由数组支持的列表中不可用。
尝试通过手动构建列表来构建列表:
List<Character> al1 = new ArrayList<Character>(Arrays.asList(a))
因此,支持列表仅用于初始化真实ArrayList
。
答案 1 :(得分:3)
Arrays.asList()
返回固定大小的列表。没有条目可以添加或删除。
您可以通过以下方式解决此问题:
al1 = new ArrayList<Character>((Arrays.asList(a)));
和al2
相同。
这已经在顶级解决方案中发生。
在第二个中,你创建一个ArrayList然后用固定的一个覆盖它,而不是填充它,保持可变。
答案 2 :(得分:0)