众所周知,我们需要实现Comparable接口,并在使用TreeSet时添加compareTo()。不这样做会抛出ClassCastException。 现在我有一个TreeSet,我需要添加ArrayLists作为TreeSet的元素。
如果我们写:
ArrayList al = new ArrayList();
ArrayList al2 = new ArrayList();
ArrayList al3 = new ArrayList();
TreeSet ts = new TreeSet();
ts.add(al);
ts.add(al2);
ts.add(al3);
抛出ClassCastException。
问题:如何将ArrayList istances(不是它们的元素)添加到TreeSet或TreeMap?
答案 0 :(得分:4)
如果你真的需要添加数组列表(作为实例)而不是它的元素,你应该使用另一个构造函数而不是空元素,考虑将constructor作为参数作为比较器。
TreeSet(Comparator<? super E> comparator)
构造一个新的空树集,根据指定的比较器进行排序。
您可以为您的目的预先定义一个Comparator,其中包含您对相关的arraylists的实际意义。
然后添加数组列表实例,根据比较器进行正确比较。
例如,您可以定义一个Comparator,它将根据数据大小比较数组列表(示例简单比较):
public class MyArrayListComparator implements java.util.Comparator<ArrayList> {
public int compare(ArrayList al1, ArrayList al2) {
if (al1.size() > al2.size())
return 1;
if (al1.size() < al2.size())
return -1;
return 0;
}
}
然后在你的代码中:
ArrayList al = new ArrayList();
ArrayList al2 = new ArrayList();
ArrayList al3 = new ArrayList();
TreeSet ts = new TreeSet(new MyArrayListComparator());
ts.add(al);
ts.add(al2);
ts.add(al3);
注意
TreeSet ts = new TreeSet(new MyArrayListComparator());
这实际上是Comparable和Comparator之间差异的一个很好的例子:
另请查看this SO Q/A以获取有关可比较与比较器的更多详细信息。
答案 1 :(得分:0)
目前,您正在添加ArrayList对象,而不是其中的元素。如另一个答案中所述,使用addAll将起作用,因为最终它将遍历每个ArrayList并添加单个元素。
答案 2 :(得分:0)
1)如前所述,您将ArrayList添加到TreeSet,而不是ArrayList中的元素。
al.add(__something__);
ts.add(al.get(__something-to-get-your-element-from-al__));
2)不建议使用原始类型,因为Lists和Sets是泛型类型:
List<String> al = new ArrayList();
Set<String> ts = new TreeSet();
al.add("hello");
al.add("hello2");
ts.add(al.get(0));
ts.add(al.get(1));
或:
ts.addAll(al); //which will add to your TreeSet all the elements that are in the ArrayList.
编辑:3)可能你想将ArrayList添加到TreeSet,然后你必须声明这样的集合:
List<String> al = new ArrayList();
//add elements to al
Set<List<String>> ts = new TreeSet();
ts.add(al);